home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Resources / Chat & Communication / Digsby build 37 / digsby_setup.exe / lib / ZSI / generate / containers.pyo (.txt) < prev    next >
Python Compiled Bytecode  |  2008-10-13  |  78KB  |  2,401 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.5)
  3.  
  4. import types
  5. import warnings
  6. from utility import StringWriter, TextProtect, TextProtectAttributeName, GetPartsSubNames
  7. from utility import NamespaceAliasDict as NAD, NCName_to_ClassName as NC_to_CN
  8. import ZSI
  9. from ZSI.TC import _is_xsd_or_soap_ns
  10. from ZSI.wstools import XMLSchema, WSDLTools
  11. from ZSI.wstools.Namespaces import SCHEMA, SOAP, WSDL
  12. from ZSI.wstools.logging import getLogger as _GetLogger
  13. from ZSI.typeinterpreter import BaseTypeInterpreter
  14. from ZSI.generate import WSISpec, WSInteropError, Wsdl2PythonError, WsdlGeneratorError, WSDLFormatError
  15. ID1 = '    '
  16. ID2 = 2 * ID1
  17. ID3 = 3 * ID1
  18. ID4 = 4 * ID1
  19. ID5 = 5 * ID1
  20. ID6 = 6 * ID1
  21. KW = {
  22.     'ID1': ID1,
  23.     'ID2': ID2,
  24.     'ID3': ID3,
  25.     'ID4': ID4,
  26.     'ID5': ID5,
  27.     'ID6': ID6 }
  28. DEC = '_Dec'
  29. DEF = '_Def'
  30.  
  31. type_class_name = lambda n: '%s%s' % (NC_to_CN(n), DEF)
  32.  
  33. element_class_name = lambda n: '%s%s' % (NC_to_CN(n), DEC)
  34.  
  35. def IsRPC(item):
  36.     if not isinstance(item, WSDLTools.OperationBinding):
  37.         raise TypeError, 'IsRPC takes 1 argument of type WSDLTools.OperationBinding'
  38.     
  39.     soapbinding = item.getBinding().findBinding(WSDLTools.SoapBinding)
  40.     sob = item.findBinding(WSDLTools.SoapOperationBinding)
  41.     style = soapbinding.style
  42.     if sob is not None:
  43.         if not sob.style:
  44.             pass
  45.         style = soapbinding.style
  46.     
  47.     return style == 'rpc'
  48.  
  49.  
  50. def IsLiteral(item):
  51.     if not isinstance(item, WSDLTools.MessageRoleBinding):
  52.         raise TypeError, 'IsLiteral takes 1 argument of type WSDLTools.MessageRoleBinding'
  53.     
  54.     sbb = None
  55.     if item.type == 'input' or item.type == 'output':
  56.         sbb = item.findBinding(WSDLTools.SoapBodyBinding)
  57.     
  58.     if sbb is None:
  59.         raise ValueError, 'Missing soap:body binding.'
  60.     
  61.     return sbb.use == 'literal'
  62.  
  63.  
  64. def SetTypeNameFunc(func):
  65.     global type_class_name
  66.     type_class_name = func
  67.  
  68.  
  69. def SetElementNameFunc(func):
  70.     global element_class_name
  71.     element_class_name = func
  72.  
  73.  
  74. def GetClassNameFromSchemaItem(item, do_extended = False):
  75.     alias = NAD.getAlias(item.getTargetNamespace())
  76.     if item.isDefinition() is True:
  77.         return '%s.%s' % (alias, NC_to_CN('%s' % type_class_name(item.getAttributeName())))
  78.     
  79.  
  80.  
  81. def FromMessageGetSimpleElementDeclaration(message):
  82.     if len(message.parts) == 1 and message.parts[0].element is not None:
  83.         part = message.parts[0]
  84.         (nsuri, name) = part.element
  85.         wsdl = message.getWSDL()
  86.         types = wsdl.types
  87.         if types.has_key(nsuri) and types[nsuri].elements.has_key(name):
  88.             e = types[nsuri].elements[name]
  89.             if isinstance(e, XMLSchema.ElementDeclaration) is True and e.getAttribute('type'):
  90.                 typ = e.getAttribute('type')
  91.                 bt = BaseTypeInterpreter()
  92.                 ptype = bt.get_pythontype(typ[1], typ[0])
  93.                 return ptype
  94.             
  95.         
  96.     
  97.  
  98.  
  99. class AttributeMixIn:
  100.     attribute_typecode = 'self.attribute_typecode_dict'
  101.     built_in_refs = [
  102.         (SOAP.ENC, 'arrayType')]
  103.     
  104.     def _setAttributes(self, attributes):
  105.         atd = self.attribute_typecode
  106.         atd_list = formatted_attribute_list = []
  107.         if not attributes:
  108.             return formatted_attribute_list
  109.         
  110.         atd_list.append('# attribute handling code')
  111.         idx = 0
  112.         while idx < len(attributes):
  113.             a = attributes[idx]
  114.             idx += 1
  115.             if a.isWildCard() and a.isDeclaration():
  116.                 atd_list.append('%s[("%s","anyAttribute")] = ZSI.TC.AnyElement()' % (atd, SCHEMA.XSD3))
  117.                 continue
  118.             if a.isDeclaration():
  119.                 tdef = a.getTypeDefinition('type')
  120.                 if tdef is not None:
  121.                     tc = '%s.%s(None)' % (NAD.getAlias(tdef.getTargetNamespace()), self.mangle(type_class_name(tdef.getAttributeName())))
  122.                 else:
  123.                     t = a.getAttribute('type')
  124.                     
  125.                     try:
  126.                         tc = BTI.get_typeclass(t[1], t[0])
  127.                     except:
  128.                         tc = ZSI.TC.String
  129.  
  130.                     if tc is not None:
  131.                         tc = '%s()' % tc
  132.                     
  133.                 key = None
  134.                 if a.getAttribute('form') == 'qualified':
  135.                     key = '("%s","%s")' % (a.getTargetNamespace(), a.getAttribute('name'))
  136.                 elif a.getAttribute('form') == 'unqualified':
  137.                     key = '"%s"' % a.getAttribute('name')
  138.                 else:
  139.                     raise ContainerError, 'attribute form must be un/qualified %s' % a.getAttribute('form')
  140.                 atd_list.append('%s[%s] = %s' % (atd, key, tc))
  141.                 continue
  142.             None if a.isReference() and a.isAttributeGroup() else ga is None
  143.             raise TypeError, 'expecting an attribute: %s' % a.getItemTrace()
  144.         return formatted_attribute_list
  145.  
  146.  
  147.  
  148. class ContainerError(Exception):
  149.     pass
  150.  
  151.  
  152. class ContainerBase:
  153.     func_aname = staticmethod(TextProtectAttributeName)
  154.     logger = _GetLogger('ContainerBase')
  155.     
  156.     def __init__(self):
  157.         self.content = StringWriter('\n')
  158.         self._ContainerBase__setup = False
  159.         self.ns = None
  160.  
  161.     
  162.     def __str__(self):
  163.         return self.getvalue()
  164.  
  165.     
  166.     def mangle(self, s):
  167.         return TextProtect(s)
  168.  
  169.     
  170.     def write(self, s):
  171.         self.content.write(s)
  172.  
  173.     
  174.     def writeArray(self, a):
  175.         self.content.write('\n'.join(a))
  176.  
  177.     
  178.     def _setContent(self):
  179.         raise NotImplementedError, 'abstract method not implemented'
  180.  
  181.     
  182.     def getvalue(self):
  183.         if not self._ContainerBase__setup:
  184.             self._setContent()
  185.             self._ContainerBase__setup = True
  186.         
  187.         return self.content.getvalue()
  188.  
  189.     
  190.     def getNSAlias(self):
  191.         if self.ns is not None:
  192.             return NAD.getAlias(self.ns)
  193.         
  194.         raise ContainerError, 'no self.ns attr defined in %s' % self.__class__
  195.  
  196.     
  197.     def getNSModuleName(self):
  198.         if self.ns:
  199.             return NAD.getModuleName(self.ns)
  200.         
  201.         raise ContainerError, 'no self.ns attr defined in %s' % self.__class__
  202.  
  203.     
  204.     def getAttributeName(self, name):
  205.         if self.func_aname is None:
  206.             return name
  207.         
  208.         f = self.func_aname
  209.         return f(name)
  210.  
  211.  
  212.  
  213. class ServiceContainerBase(ContainerBase):
  214.     clientClassSuffix = 'SOAP'
  215.     logger = _GetLogger('ServiceContainerBase')
  216.  
  217.  
  218. class ServiceHeaderContainer(ServiceContainerBase):
  219.     imports = [
  220.         '\nimport urlparse, types',
  221.         'from ZSI.TCcompound import ComplexType, Struct',
  222.         'from ZSI import client',
  223.         'from ZSI.schema import GED, GTD',
  224.         'import ZSI']
  225.     logger = _GetLogger('ServiceHeaderContainer')
  226.     
  227.     def __init__(self, do_extended = False):
  228.         ServiceContainerBase.__init__(self)
  229.         self.basic = self.imports[:]
  230.         self.types = None
  231.         self.messages = None
  232.         self.extras = []
  233.         self.do_extended = do_extended
  234.  
  235.     
  236.     def setTypesModuleName(self, module):
  237.         self.types = module
  238.  
  239.     
  240.     def setMessagesModuleName(self, module):
  241.         self.messages = module
  242.  
  243.     
  244.     def appendImport(self, statement):
  245.         if type(statement) in (list, tuple):
  246.             self.extras += statement
  247.         else:
  248.             self.extras.append(statement)
  249.  
  250.     
  251.     def _setContent(self):
  252.         if self.messages:
  253.             self.write('from %s import *' % self.messages)
  254.         
  255.         if self.types:
  256.             self.write('from %s import *' % self.types)
  257.         
  258.         imports = self.basic[:]
  259.         imports += self.extras
  260.         self.writeArray(imports)
  261.  
  262.  
  263.  
  264. class ServiceLocatorContainer(ServiceContainerBase):
  265.     logger = _GetLogger('ServiceLocatorContainer')
  266.     
  267.     def __init__(self):
  268.         ServiceContainerBase.__init__(self)
  269.         self.serviceName = None
  270.         self.portInfo = []
  271.         self.locatorName = None
  272.         self.portMethods = []
  273.  
  274.     
  275.     def setUp(self, service):
  276.         self.serviceName = service.name
  277.         for p in service.ports:
  278.             
  279.             try:
  280.                 ab = p.getAddressBinding()
  281.             except WSDLTools.WSDLError:
  282.                 ex = None
  283.                 self.logger.warning('Skip port(%s), missing address binding' % p.name)
  284.                 continue
  285.  
  286.             if isinstance(ab, WSDLTools.SoapAddressBinding) is False:
  287.                 self.logger.warning('Skip port(%s), not a SOAP-1.1 address binding' % p.name)
  288.                 continue
  289.             
  290.             self.portInfo.append((NC_to_CN(p.name), NC_to_CN(p.getBinding().name), ab.location))
  291.         
  292.  
  293.     
  294.     def getLocatorName(self):
  295.         return self.locatorName
  296.  
  297.     
  298.     def getPortMethods(self):
  299.         return self.portMethods
  300.  
  301.     
  302.     def _setContent(self):
  303.         if not self.serviceName:
  304.             raise ContainerError, 'no service name defined!'
  305.         
  306.         self.serviceName = self.mangle(self.serviceName)
  307.         self.locatorName = '%sLocator' % self.serviceName
  308.         locator = [
  309.             '# Locator',
  310.             'class %s:' % self.locatorName]
  311.         self.portMethods = []
  312.         kwargs = KW.copy()
  313.         for port, bind, addr in self.portInfo:
  314.             method = 'get%s' % port
  315.             kwargs.update(dict(port = port, bind = bind, addr = addr, service = self.serviceName, suffix = self.clientClassSuffix, method = method))
  316.             locator += [
  317.                 '%(ID1)s%(port)s_address = "%(addr)s"' % kwargs,
  318.                 '%(ID1)sdef get%(port)sAddress(self):' % kwargs,
  319.                 '%(ID2)sreturn %(service)sLocator.%(port)s_address' % kwargs,
  320.                 '%(ID1)sdef %(method)s(self, url=None, **kw):' % kwargs,
  321.                 '%(ID2)sreturn %(bind)s%(suffix)s(url or %(service)sLocator.%(port)s_address, **kw)' % kwargs]
  322.             self.portMethods.append(method)
  323.         
  324.         self.writeArray(locator)
  325.  
  326.  
  327.  
  328. class ServiceOperationContainer(ServiceContainerBase):
  329.     logger = _GetLogger('ServiceOperationContainer')
  330.     
  331.     def __init__(self, useWSA = False, do_extended = False):
  332.         ServiceContainerBase.__init__(self)
  333.         self.useWSA = useWSA
  334.         self.do_extended = do_extended
  335.  
  336.     
  337.     def hasInput(self):
  338.         return self.inputName is not None
  339.  
  340.     
  341.     def hasOutput(self):
  342.         return self.outputName is not None
  343.  
  344.     
  345.     def isRPC(self):
  346.         return IsRPC(self.binding_operation)
  347.  
  348.     
  349.     def isLiteral(self, input = True):
  350.         msgrole = self.binding_operation.input
  351.         if input is False:
  352.             msgrole = self.binding_operation.output
  353.         
  354.         return IsLiteral(msgrole)
  355.  
  356.     
  357.     def isSimpleType(self, input = True):
  358.         if input is False:
  359.             return self.outputSimpleType
  360.         
  361.         return self.inputSimpleType
  362.  
  363.     
  364.     def getOperation(self):
  365.         return self.port.operations.get(self.name)
  366.  
  367.     
  368.     def getBOperation(self):
  369.         return self.port.get(self.name)
  370.  
  371.     
  372.     def getOperationName(self):
  373.         return self.name
  374.  
  375.     
  376.     def setUp(self, item):
  377.         if not isinstance(item, WSDLTools.OperationBinding):
  378.             raise TypeError, 'Expecting WSDLTools Operation instance'
  379.         
  380.         if not item.input:
  381.             raise WSDLFormatError('No <input/> in <binding name="%s"><operation name="%s">' % (item.getBinding().name, item.name))
  382.         
  383.         self.name = None
  384.         self.port = None
  385.         self.soapaction = None
  386.         self.inputName = None
  387.         self.outputName = None
  388.         self.inputSimpleType = None
  389.         self.outputSimpleType = None
  390.         self.inputAction = None
  391.         self.outputAction = None
  392.         self.port = port = item.getBinding().getPortType()
  393.         self._wsdl = item.getWSDL()
  394.         self.name = name = item.name
  395.         self.binding_operation = bop = item
  396.         self.soap_input_headers = None
  397.         self.soap_output_headers = None
  398.         op = port.operations.get(name)
  399.         if op is None:
  400.             raise WSDLFormatError('<portType name="%s"/> no match for <binding name="%s"><operation name="%s">' % (port.name, item.getBinding().name, item.name))
  401.         
  402.         soap_bop = bop.findBinding(WSDLTools.SoapOperationBinding)
  403.         if soap_bop is None:
  404.             raise SOAPBindingError, 'expecting SOAP Bindings'
  405.         
  406.         self.soapaction = soap_bop.soapAction
  407.         sbody = bop.input.findBinding(WSDLTools.SoapBodyBinding)
  408.         if not sbody:
  409.             raise SOAPBindingError('Missing <binding name="%s"><operation name="%s"><input><soap:body>' % (port.binding.name, bop.name))
  410.         
  411.         self.encodingStyle = None
  412.         if sbody.use == 'encoded':
  413.             self.encodingStyle = sbody.encodingStyle
  414.         
  415.         self.inputName = op.getInputMessage().name
  416.         self.inputSimpleType = FromMessageGetSimpleElementDeclaration(op.getInputMessage())
  417.         self.inputAction = op.getInputAction()
  418.         self.soap_input_headers = bop.input.findBindings(WSDLTools.SoapHeaderBinding)
  419.         if bop.output is not None:
  420.             sbody = bop.output.findBinding(WSDLTools.SoapBodyBinding)
  421.             if not item.output:
  422.                 raise WSDLFormatError, 'Operation %s, no match for output binding' % name
  423.             
  424.             self.outputName = op.getOutputMessage().name
  425.             self.outputSimpleType = FromMessageGetSimpleElementDeclaration(op.getOutputMessage())
  426.             self.outputAction = op.getOutputAction()
  427.             self.soap_output_headers = bop.output.findBindings(WSDLTools.SoapHeaderBinding)
  428.         
  429.  
  430.     
  431.     def _setContent(self):
  432.         kwstring = 'kw = {}'
  433.         tCheck = 'if isinstance(request, %s) is False:' % self.inputName
  434.         bindArgs = ''
  435.         if self.encodingStyle is not None:
  436.             bindArgs = 'encodingStyle="%s", ' % self.encodingStyle
  437.         
  438.         if self.useWSA:
  439.             wsactionIn = 'wsaction = "%s"' % self.inputAction
  440.             wsactionOut = 'wsaction = "%s"' % self.outputAction
  441.             bindArgs += 'wsaction=wsaction, endPointReference=self.endPointReference, '
  442.             responseArgs = ', wsaction=wsaction'
  443.         else:
  444.             wsactionIn = '# no input wsaction'
  445.             wsactionOut = '# no output wsaction'
  446.             responseArgs = ''
  447.         bindArgs += '**kw)'
  448.         if self.do_extended:
  449.             inputName = self.getOperation().getInputMessage().name
  450.             wrap_str = ''
  451.             partsList = self.getOperation().getInputMessage().parts.values()
  452.             
  453.             try:
  454.                 subNames = GetPartsSubNames(partsList, self._wsdl)
  455.             except TypeError:
  456.                 ex = None
  457.                 raise Wsdl2PythonError, 'Extended generation failure: only supports doc/lit, ' + 'and all element attributes (<message><part element=' + '"my:GED"></message>) must refer to single global ' + 'element declaration with complexType content.  ' + '\n\n**** TRY WITHOUT EXTENDED ****\n'
  458.  
  459.             args = []
  460.             for pa in subNames:
  461.                 args += pa
  462.             
  463.             for arg in args:
  464.                 wrap_str += '%srequest.%s = %s\n' % (ID2, self.getAttributeName(arg), self.mangle(arg))
  465.             
  466.             argsStr = ','.join(args)
  467.             if len(argsStr) > 1:
  468.                 argsStr = ', ' + argsStr
  469.             
  470.             method = [
  471.                 '%s# op: %s' % (ID1, self.getOperation().getInputMessage()),
  472.                 '%sdef %s(self%s):' % (ID1, self.name, argsStr),
  473.                 '\n%srequest = %s()' % (ID2, self.inputName),
  474.                 '%s' % wrap_str,
  475.                 '%s%s' % (ID2, kwstring),
  476.                 '%s%s' % (ID2, wsactionIn),
  477.                 '%sself.binding.Send(None, None, request, soapaction="%s", %s' % (ID2, self.soapaction, bindArgs)]
  478.         elif self.soap_input_headers:
  479.             method = [
  480.                 '%s# op: %s' % (ID1, self.name),
  481.                 '%sdef %s(self, request, soapheaders=(), **kw):' % (ID1, self.name),
  482.                 '%s%s' % (ID2, tCheck),
  483.                 '%sraise TypeError, "%%s incorrect request type" %% (%s)' % (ID3, 'request.__class__'),
  484.                 '%s%s' % (ID2, wsactionIn),
  485.                 '%s# TODO: Check soapheaders' % ID2,
  486.                 '%sself.binding.Send(None, None, request, soapaction="%s", soapheaders=soapheaders, %s' % (ID2, self.soapaction, bindArgs)]
  487.         else:
  488.             method = [
  489.                 '%s# op: %s' % (ID1, self.name),
  490.                 '%sdef %s(self, request, **kw):' % (ID1, self.name),
  491.                 '%s%s' % (ID2, tCheck),
  492.                 '%sraise TypeError, "%%s incorrect request type" %% (%s)' % (ID3, 'request.__class__'),
  493.                 '%s%s' % (ID2, wsactionIn),
  494.                 '%sself.binding.Send(None, None, request, soapaction="%s", %s' % (ID2, self.soapaction, bindArgs)]
  495.         if not self.outputName:
  496.             method.append('%s#check for soap, assume soap:fault' % (ID2,))
  497.             method.append('%sif self.binding.IsSOAP(): self.binding.Receive(None, **kw)' % (ID2,))
  498.             self.writeArray(method)
  499.             return None
  500.         
  501.         response = [
  502.             '%s%s' % (ID2, wsactionOut)]
  503.         if self.isRPC() and not self.isLiteral():
  504.             response.append('%stypecode = Struct(pname=None, ofwhat=%s.typecode.ofwhat, pyclass=%s.typecode.pyclass)' % (ID2, self.outputName, self.outputName))
  505.             response.append('%sresponse = self.binding.Receive(typecode%s)' % (ID2, responseArgs))
  506.         else:
  507.             response.append('%sresponse = self.binding.Receive(%s.typecode%s)' % (ID2, self.outputName, responseArgs))
  508.         if self.soap_output_headers:
  509.             sh = '['
  510.             for shb in self.soap_output_headers:
  511.                 shb.message
  512.                 shb.part
  513.                 
  514.                 try:
  515.                     msg = self._wsdl.messages[shb.message]
  516.                     part = msg.parts[shb.part]
  517.                     if part.element is not None:
  518.                         sh += 'GED%s,' % str(part.element)
  519.                     else:
  520.                         warnings.warn('skipping soap output header in Message "%s"' % str(msg))
  521.                 continue
  522.                 raise WSDLFormatError('failure processing output header typecodes, ' + 'could not find message "%s" or its part "%s"' % (shb.message, shb.part))
  523.                 continue
  524.  
  525.             
  526.             sh += ']'
  527.             if len(sh) > 2:
  528.                 response.append('%sself.soapheaders = self.binding.ps.ParseHeaderElements(%s)' % (ID2, sh))
  529.             
  530.         
  531.         if self.outputSimpleType:
  532.             response.append('%sreturn %s(response)' % (ID2, self.outputName))
  533.         elif self.do_extended:
  534.             partsList = self.getOperation().getOutputMessage().parts.values()
  535.             subNames = GetPartsSubNames(partsList, self._wsdl)
  536.             args = []
  537.             for pa in subNames:
  538.                 args += pa
  539.             
  540.             for arg in args:
  541.                 response.append('%s%s = response.%s' % (ID2, self.mangle(arg), self.getAttributeName(arg)))
  542.             
  543.             margs = ','.join(args)
  544.             response.append('%sreturn %s' % (ID2, margs))
  545.         else:
  546.             response.append('%sreturn response' % ID2)
  547.         method += response
  548.         self.writeArray(method)
  549.  
  550.  
  551.  
  552. class BindingDescription(ServiceContainerBase):
  553.     readerclass = None
  554.     writerclass = None
  555.     operationclass = ServiceOperationContainer
  556.     logger = _GetLogger('BindingDescription')
  557.     
  558.     def __init__(self, useWSA = False, do_extended = False, wsdl = None):
  559.         ServiceContainerBase.__init__(self)
  560.         self.useWSA = useWSA
  561.         self.rProp = None
  562.         self.operations = None
  563.         self.do_extended = do_extended
  564.         self._wsdl = wsdl
  565.  
  566.     
  567.     def setReaderClass(cls, className):
  568.         cls.readerclass = className
  569.  
  570.     setReaderClass = classmethod(setReaderClass)
  571.     
  572.     def setWriterClass(cls, className):
  573.         cls.writerclass = className
  574.  
  575.     setWriterClass = classmethod(setWriterClass)
  576.     
  577.     def setOperationClass(cls, className):
  578.         cls.operationclass = className
  579.  
  580.     setOperationClass = classmethod(setOperationClass)
  581.     
  582.     def setUp(self, item):
  583.         portType = item.getPortType()
  584.         self._kwargs = KW.copy()
  585.         self._kwargs['bind'] = NC_to_CN(item.name)
  586.         self.operations = []
  587.         self.rProp = portType.getResourceProperties()
  588.         soap_binding = item.findBinding(WSDLTools.SoapBinding)
  589.         if soap_binding is None:
  590.             raise Wsdl2PythonError, 'Binding(%s) missing WSDLTools.SoapBinding' % item.name
  591.         
  592.         for bop in item.operations:
  593.             soap_bop = bop.findBinding(WSDLTools.SoapOperationBinding)
  594.             if soap_bop is None:
  595.                 self.logger.warning('Skip Binding(%s) operation(%s) no SOAP Binding Operation' % (item.name, bop.name))
  596.                 continue
  597.             
  598.             if bop.input is not None:
  599.                 soapBodyBind = bop.input.findBinding(WSDLTools.SoapBodyBinding)
  600.                 if soapBodyBind is None:
  601.                     self.logger.warning('Skip Binding(%s) operation(%s) Bindings(%s) not supported' % (item.name, bop.name, bop.extensions))
  602.                     continue
  603.                 
  604.             
  605.             op = portType.operations.get(bop.name)
  606.             if op is None:
  607.                 raise Wsdl2PythonError, 'no matching portType/Binding operation(%s)' % bop.name
  608.             
  609.             c = self.operationclass(useWSA = self.useWSA, do_extended = self.do_extended)
  610.             c.setUp(bop)
  611.             self.operations.append(c)
  612.         
  613.  
  614.     
  615.     def _setContent(self):
  616.         if self.useWSA is True:
  617.             args = 'endPointReference=None, **kw'
  618.             epr = 'self.endPointReference = endPointReference'
  619.         else:
  620.             args = '**kw'
  621.             epr = '# no ws-addressing'
  622.         if self.rProp:
  623.             rp = 'kw.setdefault("ResourceProperties", ("%s","%s"))' % (self.rProp[0], self.rProp[1])
  624.         else:
  625.             rp = '# no resource properties'
  626.         kwargs = self._kwargs
  627.         kwargs.update(dict(suffix = self.clientClassSuffix, args = args, epr = epr, rp = rp, readerclass = self.readerclass, writerclass = self.writerclass))
  628.         methods = [
  629.             '# Methods',
  630.             'class %(bind)s%(suffix)s:' % kwargs,
  631.             '%(ID1)sdef __init__(self, url, %(args)s):' % kwargs,
  632.             '%(ID2)skw.setdefault("readerclass", %(readerclass)s)' % kwargs,
  633.             '%(ID2)skw.setdefault("writerclass", %(writerclass)s)' % kwargs,
  634.             '%(ID2)s%(rp)s' % kwargs,
  635.             '%(ID2)sself.binding = client.Binding(url=url, **kw)' % kwargs,
  636.             '%(ID2)s%(epr)s' % kwargs]
  637.         for op in self.operations:
  638.             methods += [
  639.                 op.getvalue()]
  640.         
  641.         self.writeArray(methods)
  642.  
  643.  
  644. ServiceOperationsClassContainer = BindingDescription
  645.  
  646. class MessageContainerInterface:
  647.     logger = _GetLogger('MessageContainerInterface')
  648.     
  649.     def setUp(self, port, soc, input):
  650.         raise NotImplementedError, 'Message container must implemented setUp.'
  651.  
  652.  
  653.  
  654. class ServiceDocumentLiteralMessageContainer(ServiceContainerBase, MessageContainerInterface):
  655.     logger = _GetLogger('ServiceDocumentLiteralMessageContainer')
  656.     
  657.     def __init__(self, do_extended = False):
  658.         ServiceContainerBase.__init__(self)
  659.         self.do_extended = do_extended
  660.  
  661.     
  662.     def setUp(self, port, soc, input):
  663.         content = self.content
  664.         simple = self._simple = soc.isSimpleType(soc.getOperationName())
  665.         name = soc.getOperationName()
  666.         operation = port.getBinding().getPortType().operations.get(name)
  667.         bop = port.getBinding().operations.get(name)
  668.         soapBodyBind = None
  669.         if input is True:
  670.             soapBodyBind = bop.input.findBinding(WSDLTools.SoapBodyBinding)
  671.             message = operation.getInputMessage()
  672.         else:
  673.             soapBodyBind = bop.output.findBinding(WSDLTools.SoapBodyBinding)
  674.             message = operation.getOutputMessage()
  675.         if len(message.parts) == 0:
  676.             raise Wsdl2PythonError, 'must specify part for doc/lit msg'
  677.         
  678.         p = None
  679.         if soapBodyBind.parts is not None:
  680.             if len(soapBodyBind.parts) > 1:
  681.                 raise Wsdl2PythonError, 'not supporting multiple parts in soap body'
  682.             
  683.             if len(soapBodyBind.parts) == 0:
  684.                 return None
  685.             
  686.             p = message.parts.get(soapBodyBind.parts[0])
  687.         
  688.         if not p:
  689.             pass
  690.         p = message.parts[0]
  691.         if p.type:
  692.             raise Wsdl2PythonError, 'no doc/lit suport for <part type>'
  693.         
  694.         if not p.element:
  695.             return None
  696.         
  697.         self.ns = p.element[0]
  698.         content.ns = p.element[0]
  699.         content.pName = p.element[1]
  700.         content.mName = message.name
  701.  
  702.     
  703.     def _setContent(self):
  704.         
  705.         try:
  706.             simple = self._simple
  707.         except AttributeError:
  708.             raise RuntimeError, 'call setUp first'
  709.  
  710.         kw = KW.copy()
  711.         kw.update(dict(message = self.content.mName, nsuri = self.content.ns, name = self.content.pName))
  712.         self.writeArray([
  713.             '%(message)s = GED("%(nsuri)s", "%(name)s").pyclass' % kw])
  714.  
  715.  
  716.  
  717. class ServiceRPCEncodedMessageContainer(ServiceContainerBase, MessageContainerInterface):
  718.     logger = _GetLogger('ServiceRPCEncodedMessageContainer')
  719.     
  720.     def setUp(self, port, soc, input):
  721.         name = soc.getOperationName()
  722.         bop = port.getBinding().operations.get(name)
  723.         op = port.getBinding().getPortType().operations.get(name)
  724.         self.input = input
  725.         self.op = op
  726.         self.bop = bop
  727.  
  728.     
  729.     def _setContent(self):
  730.         
  731.         try:
  732.             self.op
  733.         except AttributeError:
  734.             raise RuntimeError, 'call setUp first'
  735.  
  736.         pname = self.op.name
  737.         msgRole = self.op.input
  738.         msgRoleB = self.bop.input
  739.         if self.input is False:
  740.             pname = '%sResponse' % self.op.name
  741.             msgRole = self.op.output
  742.             msgRoleB = self.bop.output
  743.         
  744.         sbody = msgRoleB.findBinding(WSDLTools.SoapBodyBinding)
  745.         if not sbody or not (sbody.namespace):
  746.             raise WSInteropError, WSISpec.R2717
  747.         
  748.         encodingStyle = sbody.encodingStyle
  749.         namespace = sbody.namespace
  750.         tcb = MessageTypecodeContainer(tuple(msgRole.getMessage().parts.list))
  751.         ofwhat = '[%s]' % tcb.getTypecodeList()
  752.         pyclass = msgRole.getMessage().name
  753.         fdict = KW.copy()
  754.         fdict['nspname'] = sbody.namespace
  755.         fdict['pname'] = pname
  756.         fdict['pyclass'] = None
  757.         fdict['ofwhat'] = ofwhat
  758.         fdict['encoded'] = namespace
  759.         fdict['typecode'] = 'Struct(pname=("%(nspname)s","%(pname)s"), ofwhat=%(ofwhat)s, pyclass=%(pyclass)s, encoded="%(encoded)s")'
  760.         message = [
  761.             'class %(pyclass)s:',
  762.             '%(ID1)sdef __init__(self, **kw):',
  763.             '%(ID2)s"""Keyword parameters:']
  764.         idx = len(message)
  765.         for a, p in zip(tcb.getAttributeNames(), tcb.getParameterNames()):
  766.             message.insert(idx, '%(ID2)s' + p + ' -- part ' + p)
  767.             message.append('%(ID2)sself.' + a + ' =  kw.get("%s")' % p)
  768.             idx += 1
  769.         
  770.         message.insert(idx, '%(ID2)s"""')
  771.         if TypecodeContainerBase.metaclass is None:
  772.             fdict['pyclass'] = pyclass
  773.             fdict['typecode'] = fdict['typecode'] % fdict
  774.             message.append('%(pyclass)s.typecode = %(typecode)s')
  775.         else:
  776.             fdict['typecode'] = fdict['typecode'] % fdict
  777.             fdict['pyclass'] = pyclass
  778.             fdict['metaclass'] = TypecodeContainerBase.metaclass
  779.             message.insert(0, '_%(pyclass)sTypecode = %(typecode)s')
  780.             message.insert(2, '%(ID1)stypecode = _%(pyclass)sTypecode')
  781.             message.insert(3, '%(ID1)s__metaclass__ = %(metaclass)s')
  782.             message.append('%(pyclass)s.typecode.pyclass = %(pyclass)s')
  783.         self.writeArray((map,)((lambda l: l % fdict), message))
  784.  
  785.  
  786.  
  787. class ServiceRPCLiteralMessageContainer(ServiceContainerBase, MessageContainerInterface):
  788.     logger = _GetLogger('ServiceRPCLiteralMessageContainer')
  789.     
  790.     def setUp(self, port, soc, input):
  791.         name = soc.getOperationName()
  792.         bop = port.getBinding().operations.get(name)
  793.         op = port.getBinding().getPortType().operations.get(name)
  794.         self.op = op
  795.         self.bop = bop
  796.         self.input = input
  797.  
  798.     
  799.     def _setContent(self):
  800.         
  801.         try:
  802.             self.op
  803.         except AttributeError:
  804.             raise RuntimeError, 'call setUp first'
  805.  
  806.         operation = self.op
  807.         input = self.input
  808.         pname = operation.name
  809.         msgRole = operation.input
  810.         msgRoleB = self.bop.input
  811.         if input is False:
  812.             pname = '%sResponse' % operation.name
  813.             msgRole = operation.output
  814.             msgRoleB = self.bop.output
  815.         
  816.         sbody = msgRoleB.findBinding(WSDLTools.SoapBodyBinding)
  817.         if not sbody or not (sbody.namespace):
  818.             raise WSInteropError, WSISpec.R2717
  819.         
  820.         namespace = sbody.namespace
  821.         tcb = MessageTypecodeContainer(tuple(msgRole.getMessage().parts.list))
  822.         ofwhat = '[%s]' % tcb.getTypecodeList()
  823.         pyclass = msgRole.getMessage().name
  824.         fdict = KW.copy()
  825.         fdict['nspname'] = sbody.namespace
  826.         fdict['pname'] = pname
  827.         fdict['pyclass'] = None
  828.         fdict['ofwhat'] = ofwhat
  829.         fdict['encoded'] = namespace
  830.         fdict['typecode'] = 'Struct(pname=("%(nspname)s","%(pname)s"), ofwhat=%(ofwhat)s, pyclass=%(pyclass)s, encoded="%(encoded)s")'
  831.         message = [
  832.             'class %(pyclass)s:',
  833.             '%(ID1)sdef __init__(self, **kw):',
  834.             '%(ID2)s"""Keyword parameters:']
  835.         idx = len(message)
  836.         for a, p in zip(tcb.getAttributeNames(), tcb.getParameterNames()):
  837.             message.insert(idx, '%(ID2)s' + p + ' -- part ' + p)
  838.             message.append('%(ID2)sself.' + a + ' =  kw.get("%s")' % p)
  839.             idx += 1
  840.         
  841.         message.insert(idx, '%(ID2)s"""')
  842.         if TypecodeContainerBase.metaclass is None:
  843.             fdict['pyclass'] = pyclass
  844.             fdict['typecode'] = fdict['typecode'] % fdict
  845.             message.append('%(pyclass)s.typecode = %(typecode)s')
  846.         else:
  847.             fdict['typecode'] = fdict['typecode'] % fdict
  848.             fdict['pyclass'] = pyclass
  849.             fdict['metaclass'] = TypecodeContainerBase.metaclass
  850.             message.insert(0, '_%(pyclass)sTypecode = %(typecode)s')
  851.             message.insert(2, '%(ID1)stypecode = _%(pyclass)sTypecode')
  852.             message.insert(3, '%(ID1)s__metaclass__ = %(metaclass)s')
  853.             message.append('%(pyclass)s.typecode.pyclass = %(pyclass)s')
  854.         self.writeArray((map,)((lambda l: l % fdict), message))
  855.  
  856.  
  857. TypesContainerBase = ContainerBase
  858.  
  859. class TypesHeaderContainer(TypesContainerBase):
  860.     imports = [
  861.         'import ZSI',
  862.         'import ZSI.TCcompound',
  863.         'from ZSI.schema import LocalElementDeclaration, ElementDeclaration, TypeDefinition, GTD, GED']
  864.     logger = _GetLogger('TypesHeaderContainer')
  865.     
  866.     def _setContent(self):
  867.         self.writeArray(TypesHeaderContainer.imports)
  868.  
  869.  
  870. NamespaceClassContainerBase = TypesContainerBase
  871.  
  872. class NamespaceClassHeaderContainer(NamespaceClassContainerBase):
  873.     logger = _GetLogger('NamespaceClassHeaderContainer')
  874.     
  875.     def _setContent(self):
  876.         head = [
  877.             '#' * 30,
  878.             '# targetNamespace',
  879.             '# %s' % self.ns,
  880.             '#' * 30 + '\n',
  881.             'class %s:' % self.getNSAlias(),
  882.             '%stargetNamespace = "%s"' % (ID1, self.ns)]
  883.         self.writeArray(head)
  884.  
  885.  
  886.  
  887. class NamespaceClassFooterContainer(NamespaceClassContainerBase):
  888.     logger = _GetLogger('NamespaceClassFooterContainer')
  889.     
  890.     def _setContent(self):
  891.         foot = [
  892.             '# end class %s (tns: %s)' % (self.getNSAlias(), self.ns)]
  893.         self.writeArray(foot)
  894.  
  895.  
  896. BTI = BaseTypeInterpreter()
  897.  
  898. class TypecodeContainerBase(TypesContainerBase):
  899.     mixed_content_aname = 'text'
  900.     attributes_aname = 'attrs'
  901.     metaclass = None
  902.     lazy = False
  903.     logger = _GetLogger('TypecodeContainerBase')
  904.     
  905.     def __init__(self, do_extended = False, extPyClasses = None):
  906.         TypesContainerBase.__init__(self)
  907.         self.name = None
  908.         self.allOptional = False
  909.         self.mgContent = None
  910.         self.contentFlattened = False
  911.         self.elementAttrs = []
  912.         self.tcListElements = []
  913.         self.tcListSet = False
  914.         self.localTypes = []
  915.         self.parentClass = None
  916.         self.mixed = False
  917.         self.extraFlags = ''
  918.         self.attrComponents = None
  919.         self.do_extended = do_extended
  920.         if extPyClasses is None:
  921.             self.extPyClasses = { }
  922.         else:
  923.             self.extPyClasses = extPyClasses
  924.  
  925.     
  926.     def getvalue(self):
  927.         out = ContainerBase.getvalue(self)
  928.         for item in self.localTypes:
  929.             content = None
  930.             etp = item.content
  931.             qName = item.getAttribute('type')
  932.             if not qName:
  933.                 etp = item.content
  934.                 local = True
  935.             else:
  936.                 etp = item.getTypeDefinition('type')
  937.             if etp is None:
  938.                 if local is True:
  939.                     content = ElementLocalComplexTypeContainer(do_extended = self.do_extended)
  940.                 else:
  941.                     content = ElementSimpleTypeContainer()
  942.             elif etp.isLocal() is False:
  943.                 content = ElementGlobalDefContainer()
  944.             elif etp.isSimple() is True:
  945.                 content = ElementLocalSimpleTypeContainer()
  946.             elif etp.isComplex():
  947.                 content = ElementLocalComplexTypeContainer(do_extended = self.do_extended)
  948.             else:
  949.                 raise Wsdl2PythonError, 'Unknown element declaration: %s' % item.getItemTrace()
  950.             content.setUp(item)
  951.             out += '\n\n'
  952.             if self.parentClass:
  953.                 content.parentClass = '%s.%s' % (self.parentClass, self.getClassName())
  954.             else:
  955.                 content.parentClass = '%s.%s' % (self.getNSAlias(), self.getClassName())
  956.             for l in content.getvalue().split('\n'):
  957.                 if l:
  958.                     out += '%s%s\n' % (ID1, l)
  959.                     continue
  960.                 out += '\n'
  961.             
  962.             out += '\n\n'
  963.         
  964.         return out
  965.  
  966.     
  967.     def getAttributeName(self, name):
  968.         if self.func_aname is None:
  969.             return name
  970.         
  971.         f = self.func_aname
  972.         return f(name)
  973.  
  974.     
  975.     def getMixedTextAName(self):
  976.         return self.getAttributeName(self.mixed_content_aname)
  977.  
  978.     
  979.     def getClassName(self):
  980.         if not self.name:
  981.             raise ContainerError, 'self.name not defined!'
  982.         
  983.         if not hasattr(self.__class__, 'type'):
  984.             raise ContainerError, 'container type not defined!'
  985.         
  986.         if self.__class__.type == DEF:
  987.             classname = type_class_name(self.name)
  988.         elif self.__class__.type == DEC:
  989.             classname = element_class_name(self.name)
  990.         
  991.         return self.mangle(classname)
  992.  
  993.     
  994.     def hasExtPyClass(self):
  995.         if self.name in self.extPyClasses:
  996.             return True
  997.         else:
  998.             return False
  999.  
  1000.     
  1001.     def getPyClass(self):
  1002.         if self.hasExtPyClass():
  1003.             classInfo = self.extPyClasses[self.name]
  1004.             return '.'.join(classInfo)
  1005.         
  1006.         return 'Holder'
  1007.  
  1008.     
  1009.     def getPyClassDefinition(self):
  1010.         kw = KW.copy()
  1011.         if self.hasExtPyClass():
  1012.             classInfo = self.extPyClasses[self.name]
  1013.             kw['classInfo'] = classInfo[0]
  1014.             return [
  1015.                 '%(ID3)simport %(classInfo)s' % kw]
  1016.         
  1017.         kw['pyclass'] = self.getPyClass()
  1018.         definition = []
  1019.         definition.append('%(ID3)sclass %(pyclass)s:' % kw)
  1020.         if self.metaclass is not None:
  1021.             kw['type'] = self.metaclass
  1022.             definition.append('%(ID4)s__metaclass__ = %(type)s' % kw)
  1023.         
  1024.         definition.append('%(ID4)stypecode = self' % kw)
  1025.         definition.append('%(ID4)sdef __init__(self):' % kw)
  1026.         definition.append('%(ID5)s# pyclass' % kw)
  1027.         self._setUpElements()
  1028.         for el in self.elementAttrs:
  1029.             kw['element'] = el
  1030.             definition.append('%(ID2)s%(element)s' % kw)
  1031.         
  1032.         definition.append('%(ID5)sreturn' % kw)
  1033.         if self.name is not None:
  1034.             kw['name'] = self.name
  1035.             definition.append('%(ID3)s%(pyclass)s.__name__ = "%(name)s_Holder"' % kw)
  1036.         
  1037.         return definition
  1038.  
  1039.     
  1040.     def nsuriLogic(self):
  1041.         if self.parentClass:
  1042.             return 'ns = %s.%s.schema' % (self.parentClass, self.getClassName())
  1043.         
  1044.         return 'ns = %s.%s.schema' % (self.getNSAlias(), self.getClassName())
  1045.  
  1046.     
  1047.     def schemaTag(self):
  1048.         if self.ns is not None:
  1049.             return 'schema = "%s"' % self.ns
  1050.         
  1051.         raise ContainerError, 'failed to set schema targetNamespace(%s)' % self.__class__
  1052.  
  1053.     
  1054.     def typeTag(self):
  1055.         if self.name is not None:
  1056.             return 'type = (schema, "%s")' % self.name
  1057.         
  1058.         raise ContainerError, 'failed to set type name(%s)' % self.__class__
  1059.  
  1060.     
  1061.     def literalTag(self):
  1062.         if self.name is not None:
  1063.             return 'literal = "%s"' % self.name
  1064.         
  1065.         raise ContainerError, 'failed to set element name(%s)' % self.__class__
  1066.  
  1067.     
  1068.     def getExtraFlags(self):
  1069.         if self.mixed:
  1070.             self.extraFlags += 'mixed=True, mixed_aname="%s", ' % self.getMixedTextAName()
  1071.         
  1072.         return self.extraFlags
  1073.  
  1074.     
  1075.     def simpleConstructor(self, superclass = None):
  1076.         if superclass:
  1077.             return '%s.__init__(self, **kw)' % superclass
  1078.         else:
  1079.             return 'def __init__(self, **kw):'
  1080.  
  1081.     
  1082.     def pnameConstructor(self, superclass = None):
  1083.         if superclass:
  1084.             return '%s.__init__(self, pname, **kw)' % superclass
  1085.         else:
  1086.             return 'def __init__(self, pname, **kw):'
  1087.  
  1088.     
  1089.     def _setUpElements(self):
  1090.         self.logger.debug('_setUpElements: %s' % self._item.getItemTrace())
  1091.         if hasattr(self, '_done'):
  1092.             return None
  1093.         
  1094.         self._done = True
  1095.         flat = []
  1096.         content = self.mgContent
  1097.         if type(self.mgContent) is not tuple:
  1098.             mg = self.mgContent
  1099.             if not mg.isModelGroup():
  1100.                 mg = mg.content
  1101.             
  1102.             content = mg.content
  1103.             if mg.isAll():
  1104.                 flat = content
  1105.                 content = []
  1106.             elif mg.isModelGroup() and mg.isDefinition():
  1107.                 mg = mg.content
  1108.                 content = mg.content
  1109.             
  1110.         
  1111.         idx = 0
  1112.         content = list(content)
  1113.         while idx < len(content):
  1114.             c = orig = content[idx]
  1115.             if c.isElement():
  1116.                 flat.append(c)
  1117.                 idx += 1
  1118.                 continue
  1119.             
  1120.             if c.isReference() and c.isModelGroup():
  1121.                 c = c.getModelGroupReference()
  1122.             
  1123.             if c.isDefinition() and c.isModelGroup():
  1124.                 c = c.content
  1125.             
  1126.             if c.isSequence() or c.isChoice():
  1127.                 begIdx = idx
  1128.                 endIdx = begIdx + len(c.content)
  1129.                 for i in range(begIdx, endIdx):
  1130.                     content.insert(i, c.content[i - begIdx])
  1131.                 
  1132.                 content.remove(orig)
  1133.                 continue
  1134.             
  1135.             raise ContainerError, 'unexpected schema item: %s' % c.getItemTrace()
  1136.         for c in flat:
  1137.             if c.isDeclaration() and c.isElement():
  1138.                 defaultValue = 'None'
  1139.                 parent = c
  1140.                 defs = []
  1141.                 while defs.count(parent) <= 1:
  1142.                     maxOccurs = parent.getAttribute('maxOccurs')
  1143.                     if maxOccurs == 'unbounded' or int(maxOccurs) > 1:
  1144.                         defaultValue = '[]'
  1145.                         break
  1146.                     
  1147.                     parent = parent._parent()
  1148.                     if not parent.isModelGroup():
  1149.                         break
  1150.                     
  1151.                     if parent.isReference():
  1152.                         parent = parent.getModelGroupReference()
  1153.                     
  1154.                     if parent.isDefinition():
  1155.                         parent = parent.content
  1156.                         defs.append(parent)
  1157.                         continue
  1158.                 if None == c.getAttribute('name') and c.isWildCard():
  1159.                     e = '%sself.%s = %s' % (ID3, self.getAttributeName('any'), defaultValue)
  1160.                 else:
  1161.                     e = '%sself.%s = %s' % (ID3, self.getAttributeName(c.getAttribute('name')), defaultValue)
  1162.                 self.elementAttrs.append(e)
  1163.                 continue
  1164.             
  1165.             if c.isReference():
  1166.                 e = '%sself._%s = None' % (ID3, self.mangle(c.getAttribute('ref')[1]))
  1167.                 self.elementAttrs.append(e)
  1168.                 continue
  1169.             
  1170.             raise ContainerError, 'unexpected item: %s' % c.getItemTrace()
  1171.         
  1172.  
  1173.     
  1174.     def _setTypecodeList(self):
  1175.         self.logger.debug('_setTypecodeList(%r): %s' % (self.mgContent, self._item.getItemTrace()))
  1176.         flat = []
  1177.         content = self.mgContent
  1178.         if type(content) is not tuple:
  1179.             mg = content
  1180.             if not mg.isModelGroup():
  1181.                 raise Wsdl2PythonErr('Expecting ModelGroup: %s' % mg.getItemTrace())
  1182.             
  1183.             self.logger.debug('ModelGroup(%r) contents(%r): %s' % (mg, mg.content, mg.getItemTrace()))
  1184.             if mg.isReference():
  1185.                 raise RuntimeError('Unexpected modelGroup reference: %s' % mg.getItemTrace())
  1186.             
  1187.             if mg.isDefinition():
  1188.                 mg = mg.content
  1189.             
  1190.             if mg.isAll():
  1191.                 flat = mg.content
  1192.                 content = []
  1193.             elif mg.isSequence():
  1194.                 content = mg.content
  1195.             elif mg.isChoice():
  1196.                 content = mg.content
  1197.             else:
  1198.                 raise RuntimeError('Unknown schema item')
  1199.         
  1200.         idx = 0
  1201.         content = list(content)
  1202.         self.logger.debug('content: %r' % content)
  1203.         while idx < len(content):
  1204.             c = orig = content[idx]
  1205.             if c.isElement():
  1206.                 flat.append(c)
  1207.                 idx += 1
  1208.                 continue
  1209.             
  1210.             if c.isReference() and c.isModelGroup():
  1211.                 c = c.getModelGroupReference()
  1212.             
  1213.             if c.isDefinition() and c.isModelGroup():
  1214.                 c = c.content
  1215.             
  1216.             if c.isSequence() or c.isChoice():
  1217.                 begIdx = idx
  1218.                 endIdx = begIdx + len(c.content)
  1219.                 for i in range(begIdx, endIdx):
  1220.                     content.insert(i, c.content[i - begIdx])
  1221.                 
  1222.                 content.remove(orig)
  1223.                 continue
  1224.             
  1225.             raise ContainerError, 'unexpected schema item: %s' % c.getItemTrace()
  1226.         self.logger.debug('flat: %r' % list(flat))
  1227.         for c in flat:
  1228.             tc = TcListComponentContainer()
  1229.             (min, max, nil) = self._getOccurs(c)
  1230.             min = None
  1231.             max = None
  1232.             maxOccurs = 1
  1233.             parent = c
  1234.             defs = []
  1235.             while defs.count(parent) <= 1:
  1236.                 max = parent.getAttribute('maxOccurs')
  1237.                 if max == 'unbounded':
  1238.                     maxOccurs = '"%s"' % max
  1239.                     break
  1240.                 
  1241.                 maxOccurs = int(max) * maxOccurs
  1242.                 parent = parent._parent()
  1243.                 if not parent.isModelGroup():
  1244.                     break
  1245.                 
  1246.                 if parent.isReference():
  1247.                     parent = parent.getModelGroupReference()
  1248.                 
  1249.                 if parent.isDefinition():
  1250.                     parent = parent.content
  1251.                     defs.append(parent)
  1252.                     continue
  1253.             del defs
  1254.             parent = c
  1255.             while None:
  1256.                 minOccurs = int(parent.getAttribute('minOccurs'))
  1257.                 if minOccurs == 0 or parent.isChoice():
  1258.                     minOccurs = 0
  1259.                     break
  1260.                 
  1261.                 parent = parent._parent()
  1262.                 if not parent.isModelGroup():
  1263.                     minOccurs = int(c.getAttribute('minOccurs'))
  1264.                     break
  1265.                 
  1266.                 if parent.isReference():
  1267.                     parent = parent.getModelGroupReference()
  1268.                 
  1269.                 if parent.isDefinition():
  1270.                     parent = parent.content
  1271.                     continue
  1272.                 continue
  1273.                 tc.setOccurs(minOccurs, maxOccurs, nil)
  1274.                 processContents = self._getProcessContents(c)
  1275.                 tc.setProcessContents(processContents)
  1276.                 if c.isDeclaration() and c.isElement():
  1277.                     global_type = c.getAttribute('type')
  1278.                     content = getattr(c, 'content', None)
  1279.                     if c.isLocal() and c.isQualified() is False:
  1280.                         tc.unQualified()
  1281.                     
  1282.                     if c.isWildCard():
  1283.                         tc.setStyleAnyElement()
  1284.                     elif global_type is not None:
  1285.                         tc.name = c.getAttribute('name')
  1286.                         ns = global_type[0]
  1287.                         if ns in SCHEMA.XSD_LIST:
  1288.                             tpc = BTI.get_typeclass(global_type[1], global_type[0])
  1289.                             tc.klass = tpc
  1290.                         else:
  1291.                             tc.setGlobalType(*global_type)
  1292.                         del ns
  1293.                     elif content is not None and content.isLocal() and content.isComplex():
  1294.                         tc.name = c.getAttribute('name')
  1295.                         tc.klass = 'self.__class__.%s' % element_class_name(tc.name)
  1296.                         tc.setStyleElementReference()
  1297.                         self.localTypes.append(c)
  1298.                     elif content is not None and content.isLocal() and content.isSimple():
  1299.                         tc.name = c.getAttribute('name')
  1300.                         tc.klass = 'self.__class__.%s' % element_class_name(tc.name)
  1301.                         tc.setStyleElementReference()
  1302.                         self.localTypes.append(c)
  1303.                     else:
  1304.                         raise ContainerError, 'unexpected item: %s' % c.getItemTrace()
  1305.                 elif c.isReference():
  1306.                     ref = c.getAttribute('ref')
  1307.                     tc.setStyleElementReference()
  1308.                     tc.setGlobalType(*ref)
  1309.                 else:
  1310.                     raise ContainerError, 'unexpected item: %s' % c.getItemTrace()
  1311.             self.tcListElements.append(tc)
  1312.         
  1313.  
  1314.     
  1315.     def getTypecodeList(self):
  1316.         if not self.tcListSet:
  1317.             self._setTypecodeList()
  1318.             self.tcListSet = True
  1319.         
  1320.         list = []
  1321.         for e in self.tcListElements:
  1322.             list.append(str(e))
  1323.         
  1324.         return ', '.join(list)
  1325.  
  1326.     
  1327.     def _getOccurs(self, e):
  1328.         nillable = e.getAttribute('nillable')
  1329.         if nillable == 'true':
  1330.             nillable = True
  1331.         else:
  1332.             nillable = False
  1333.         maxOccurs = e.getAttribute('maxOccurs')
  1334.         if maxOccurs == 'unbounded':
  1335.             maxOccurs = '"%s"' % maxOccurs
  1336.         
  1337.         minOccurs = e.getAttribute('minOccurs')
  1338.         if self.allOptional is True:
  1339.             minOccurs = '0'
  1340.             maxOccurs = '"unbounded"'
  1341.         
  1342.         return (minOccurs, maxOccurs, nillable)
  1343.  
  1344.     
  1345.     def _getProcessContents(self, e):
  1346.         processContents = e.getAttribute('processContents')
  1347.         return processContents
  1348.  
  1349.     
  1350.     def getBasesLogic(self, indent):
  1351.         
  1352.         try:
  1353.             prefix = NAD.getAlias(self.sKlassNS)
  1354.         except WsdlGeneratorError:
  1355.             ex = None
  1356.             raise 
  1357.  
  1358.         bases = []
  1359.         bases.append('if %s.%s not in %s.%s.__bases__:' % (NAD.getAlias(self.sKlassNS), type_class_name(self.sKlass), self.getNSAlias(), self.getClassName()))
  1360.         bases.append('%sbases = list(%s.%s.__bases__)' % (ID1, self.getNSAlias(), self.getClassName()))
  1361.         bases.append('%sbases.insert(0, %s.%s)' % (ID1, NAD.getAlias(self.sKlassNS), type_class_name(self.sKlass)))
  1362.         bases.append('%s%s.%s.__bases__ = tuple(bases)' % (ID1, self.getNSAlias(), self.getClassName()))
  1363.         s = ''
  1364.         for b in bases:
  1365.             s += '%s%s\n' % (indent, b)
  1366.         
  1367.         return s
  1368.  
  1369.  
  1370.  
  1371. class MessageTypecodeContainer(TypecodeContainerBase):
  1372.     logger = _GetLogger('MessageTypecodeContainer')
  1373.     
  1374.     def __init__(self, parts = None):
  1375.         TypecodeContainerBase.__init__(self)
  1376.         self.mgContent = parts
  1377.  
  1378.     
  1379.     def _getOccurs(self, e):
  1380.         minOccurs = maxOccurs = '1'
  1381.         nillable = True
  1382.         return (minOccurs, maxOccurs, nillable)
  1383.  
  1384.     
  1385.     def _setTypecodeList(self):
  1386.         self.logger.debug('_setTypecodeList: %s' % str(self.mgContent))
  1387.         for p in self.mgContent:
  1388.             (min, max, nil) = self._getOccurs(p)
  1389.             if p.element:
  1390.                 raise WSInteropError, WSISpec.R2203
  1391.             elif p.type:
  1392.                 (nsuri, name) = p.type
  1393.                 tc = RPCMessageTcListComponentContainer(qualified = False)
  1394.                 tc.setOccurs(min, max, nil)
  1395.                 tc.name = p.name
  1396.                 if nsuri in [
  1397.                     SOAP.ENC] + SCHEMA.XSD_LIST:
  1398.                     tpc = BTI.get_typeclass(name, nsuri)
  1399.                     tc.klass = tpc
  1400.                 else:
  1401.                     tc.klass = '%s.%s' % (NAD.getAlias(nsuri), type_class_name(name))
  1402.             else:
  1403.                 raise ContainerError, 'part must define an element or type attribute'
  1404.             self.tcListElements.append(tc)
  1405.         
  1406.  
  1407.     
  1408.     def getTypecodeList(self):
  1409.         if not self.tcListSet:
  1410.             self._setTypecodeList()
  1411.             self.tcListSet = True
  1412.         
  1413.         list = []
  1414.         for e in self.tcListElements:
  1415.             list.append(str(e))
  1416.         
  1417.         return ', '.join(list)
  1418.  
  1419.     
  1420.     def getAttributeNames(self):
  1421.         return (map,)((lambda e: self.getAttributeName(e.name)), self.tcListElements)
  1422.  
  1423.     
  1424.     def getParameterNames(self):
  1425.         return map((lambda e: e.name), self.tcListElements)
  1426.  
  1427.     
  1428.     def setParts(self, parts):
  1429.         self.mgContent = parts
  1430.  
  1431.  
  1432.  
  1433. class TcListComponentContainer(ContainerBase):
  1434.     logger = _GetLogger('TcListComponentContainer')
  1435.     
  1436.     def __init__(self, qualified = True):
  1437.         ContainerBase.__init__(self)
  1438.         self.qualified = qualified
  1439.         self.name = None
  1440.         self.klass = None
  1441.         self.global_type = None
  1442.         self.min = None
  1443.         self.max = None
  1444.         self.nil = None
  1445.         self.style = None
  1446.         self.setStyleElementDeclaration()
  1447.  
  1448.     
  1449.     def setOccurs(self, min, max, nil):
  1450.         self.min = min
  1451.         self.max = max
  1452.         self.nil = nil
  1453.  
  1454.     
  1455.     def setProcessContents(self, processContents):
  1456.         self.processContents = processContents
  1457.  
  1458.     
  1459.     def setGlobalType(self, namespace, name):
  1460.         self.global_type = (namespace, name)
  1461.  
  1462.     
  1463.     def setStyleElementDeclaration(self):
  1464.         self.style = 'standard'
  1465.  
  1466.     
  1467.     def setStyleElementReference(self):
  1468.         self.style = 'ref'
  1469.  
  1470.     
  1471.     def setStyleAnyElement(self):
  1472.         self.name = 'any'
  1473.         self.style = 'anyElement'
  1474.  
  1475.     
  1476.     def unQualified(self):
  1477.         self.qualified = False
  1478.  
  1479.     
  1480.     def _getOccurs(self):
  1481.         return 'minOccurs=%s, maxOccurs=%s, nillable=%s' % (self.min, self.max, self.nil)
  1482.  
  1483.     
  1484.     def _getProcessContents(self):
  1485.         return 'processContents="%s"' % self.processContents
  1486.  
  1487.     
  1488.     def _getvalue(self):
  1489.         kw = {
  1490.             'occurs': self._getOccurs(),
  1491.             'aname': self.getAttributeName(self.name),
  1492.             'klass': self.klass,
  1493.             'lazy': TypecodeContainerBase.lazy,
  1494.             'typed': 'typed=False',
  1495.             'encoded': 'encoded=kw.get("encoded")' }
  1496.         gt = self.global_type
  1497.         if gt is not None:
  1498.             (kw['nsuri'], kw['type']) = gt
  1499.         
  1500.         if self.style == 'standard':
  1501.             kw['pname'] = '"%s"' % self.name
  1502.             if self.qualified is True:
  1503.                 kw['pname'] = '(ns,"%s")' % self.name
  1504.             
  1505.             if gt is None:
  1506.                 return '%(klass)s(pname=%(pname)s, aname="%(aname)s", %(occurs)s, %(typed)s, %(encoded)s)' % kw
  1507.             
  1508.             return 'GTD("%(nsuri)s","%(type)s",lazy=%(lazy)s)(pname=%(pname)s, aname="%(aname)s", %(occurs)s, %(typed)s, %(encoded)s)' % kw
  1509.         
  1510.         if self.style == 'ref':
  1511.             if gt is None:
  1512.                 return '%(klass)s(%(occurs)s, %(encoded)s)' % kw
  1513.             
  1514.             return 'GED("%(nsuri)s","%(type)s",lazy=%(lazy)s, isref=True)(%(occurs)s, %(encoded)s)' % kw
  1515.         
  1516.         kw['process'] = self._getProcessContents()
  1517.         if self.style == 'anyElement':
  1518.             return 'ZSI.TC.AnyElement(aname="%(aname)s", %(occurs)s, %(process)s)' % kw
  1519.         
  1520.         raise RuntimeError, 'Must set style for typecode list generation'
  1521.  
  1522.     
  1523.     def __str__(self):
  1524.         return self._getvalue()
  1525.  
  1526.  
  1527.  
  1528. class RPCMessageTcListComponentContainer(TcListComponentContainer):
  1529.     logger = _GetLogger('RPCMessageTcListComponentContainer')
  1530.     
  1531.     def __init__(self, qualified = True, encoded = None):
  1532.         TcListComponentContainer.__init__(self, qualified = qualified)
  1533.         self._encoded = encoded
  1534.  
  1535.     
  1536.     def _getvalue(self):
  1537.         encoded = self._encoded
  1538.         if encoded is not None:
  1539.             encoded = '"%s"' % self._encoded
  1540.         
  1541.         if self.style == 'standard':
  1542.             pname = '"%s"' % self.name
  1543.             if self.qualified is True:
  1544.                 pname = '(ns,"%s")' % self.name
  1545.             
  1546.             return '%s(pname=%s, aname="%s", typed=False, encoded=%s, %s)' % (self.klass, pname, self.getAttributeName(self.name), encoded, self._getOccurs())
  1547.         elif self.style == 'ref':
  1548.             return '%s(encoded=%s, %s)' % (self.klass, encoded, self._getOccurs())
  1549.         elif self.style == 'anyElement':
  1550.             return 'ZSI.TC.AnyElement(aname="%s", %s, %s)' % (self.getAttributeName(self.name), self._getOccurs(), self._getProcessContents())
  1551.         
  1552.         raise RuntimeError('Must set style(%s) for typecode list generation' % self.style)
  1553.  
  1554.  
  1555.  
  1556. class ElementSimpleTypeContainer(TypecodeContainerBase):
  1557.     type = DEC
  1558.     logger = _GetLogger('ElementSimpleTypeContainer')
  1559.     
  1560.     def _substitutionGroupTag(self):
  1561.         value = self.substitutionGroup
  1562.         if not value:
  1563.             return 'substitutionGroup = None'
  1564.         
  1565.         (nsuri, ncname) = value
  1566.         return 'substitutionGroup = ("%s","%s")' % (nsuri, ncname)
  1567.  
  1568.     
  1569.     def _setContent(self):
  1570.         aname = self.getAttributeName(self.name)
  1571.         pyclass = self.pyclass
  1572.         if pyclass == 'bool':
  1573.             pyclass = 'int'
  1574.         
  1575.         kw = KW.copy()
  1576.         kw.update(dict(aname = aname, ns = self.ns, name = self.name, substitutionGroup = self._substitutionGroupTag(), subclass = self.sKlass, literal = self.literalTag(), schema = self.schemaTag(), init = self.simpleConstructor(), klass = self.getClassName(), element = 'ElementDeclaration'))
  1577.         if self.local:
  1578.             kw['element'] = 'LocalElementDeclaration'
  1579.         
  1580.         element = (map,)((lambda i: i % kw), [
  1581.             '%(ID1)sclass %(klass)s(%(subclass)s, %(element)s):',
  1582.             '%(ID2)s%(literal)s',
  1583.             '%(ID2)s%(schema)s',
  1584.             '%(ID2)s%(init)s',
  1585.             '%(ID3)skw["pname"] = ("%(ns)s","%(name)s")',
  1586.             '%(ID3)skw["aname"] = "%(aname)s"'])
  1587.         app = element.append
  1588.         if pyclass is not None:
  1589.             app('%sclass IHolder(%s): typecode=self' % (ID3, pyclass))
  1590.             app('%skw["pyclass"] = IHolder' % ID3)
  1591.             app('%sIHolder.__name__ = "%s_immutable_holder"' % (ID3, aname))
  1592.         
  1593.         app('%s%s' % (ID3, self.simpleConstructor(self.sKlass)))
  1594.         self.writeArray(element)
  1595.  
  1596.     
  1597.     def setUp(self, tp):
  1598.         self._item = tp
  1599.         self.local = tp.isLocal()
  1600.         
  1601.         try:
  1602.             self.name = tp.getAttribute('name')
  1603.             self.substitutionGroup = tp.getAttribute('substitutionGroup')
  1604.             self.ns = tp.getTargetNamespace()
  1605.             qName = tp.getAttribute('type')
  1606.         except Exception:
  1607.             ex = None
  1608.             raise Wsdl2PythonError('Error occured processing element: %s' % tp.getItemTrace(), *ex.args)
  1609.  
  1610.         if qName is None:
  1611.             raise Wsdl2PythonError('Missing QName for element type attribute: %s' % tp.getItemTrace())
  1612.         
  1613.         tns = qName.getTargetNamespace()
  1614.         local = qName.getName()
  1615.         self.sKlass = BTI.get_typeclass(local, tns)
  1616.         if self.sKlass is None:
  1617.             raise Wsdl2PythonError('No built-in typecode for type definition("%s","%s"): %s' % (tns, local, tp.getItemTrace()))
  1618.         
  1619.         
  1620.         try:
  1621.             self.pyclass = BTI.get_pythontype(None, None, typeclass = self.sKlass)
  1622.         except Exception:
  1623.             ex = None
  1624.             raise Wsdl2PythonError('Error occured processing element: %s' % tp.getItemTrace(), *ex.args)
  1625.  
  1626.  
  1627.  
  1628.  
  1629. class ElementLocalSimpleTypeContainer(TypecodeContainerBase):
  1630.     type = DEC
  1631.     logger = _GetLogger('ElementLocalSimpleTypeContainer')
  1632.     
  1633.     def _setContent(self):
  1634.         kw = KW.copy()
  1635.         kw.update(dict(aname = self.getAttributeName(self.name), ns = self.ns, name = self.name, subclass = self.sKlass, literal = self.literalTag(), schema = self.schemaTag(), init = self.simpleConstructor(), klass = self.getClassName(), element = 'ElementDeclaration', baseinit = self.simpleConstructor(self.sKlass)))
  1636.         if self.local:
  1637.             kw['element'] = 'LocalElementDeclaration'
  1638.         
  1639.         element = (map,)((lambda i: i % kw), [
  1640.             '%(ID1)sclass %(klass)s(%(subclass)s, %(element)s):',
  1641.             '%(ID2)s%(literal)s',
  1642.             '%(ID2)s%(schema)s',
  1643.             '%(ID2)s%(init)s',
  1644.             '%(ID3)skw["pname"] = ("%(ns)s","%(name)s")',
  1645.             '%(ID3)skw["aname"] = "%(aname)s"',
  1646.             '%(ID3)s%(baseinit)s'])
  1647.         app = element.append
  1648.         pyclass = self.pyclass
  1649.         if pyclass is not None:
  1650.             if pyclass == 'bool':
  1651.                 pyclass = 'int'
  1652.             
  1653.             kw['pyclass'] = pyclass
  1654.             app('%(ID3)sclass IHolder(%(pyclass)s): typecode=self' % kw)
  1655.             app('%(ID3)sself.pyclass = IHolder' % kw)
  1656.             app('%(ID3)sIHolder.__name__ = "%(aname)s_immutable_holder"' % kw)
  1657.         
  1658.         self.writeArray(element)
  1659.  
  1660.     
  1661.     def _setup_pyclass(self):
  1662.         
  1663.         try:
  1664.             self.pyclass = BTI.get_pythontype(None, None, typeclass = self.sKlass)
  1665.         except Exception:
  1666.             ex = None
  1667.             raise Wsdl2PythonError('Error occured processing element: %s' % self._item.getItemTrace(), *ex.args)
  1668.  
  1669.  
  1670.     
  1671.     def setUp(self, tp):
  1672.         self._item = tp
  1673.         self.local = tp.isLocal()
  1674.         self.name = tp.getAttribute('name')
  1675.         self.ns = tp.getTargetNamespace()
  1676.         content = tp.content.content
  1677.         if content.isRestriction():
  1678.             
  1679.             try:
  1680.                 base = content.getTypeDefinition()
  1681.             except XMLSchema.SchemaError:
  1682.                 ex = None
  1683.                 base = None
  1684.  
  1685.             qName = content.getAttributeBase()
  1686.             if base is None:
  1687.                 self.sKlass = BTI.get_typeclass(qName[1], qName[0])
  1688.                 self._setup_pyclass()
  1689.                 return None
  1690.             
  1691.             raise Wsdl2PythonError, 'unsupported local simpleType restriction: %s' % tp.content.getItemTrace()
  1692.         
  1693.         if content.isList():
  1694.             
  1695.             try:
  1696.                 base = content.getTypeDefinition()
  1697.             except XMLSchema.SchemaError:
  1698.                 ex = None
  1699.                 base = None
  1700.  
  1701.             if base is None:
  1702.                 qName = content.getItemType()
  1703.                 self.sKlass = BTI.get_typeclass(qName[1], qName[0])
  1704.                 self._setup_pyclass()
  1705.                 return None
  1706.             
  1707.             raise Wsdl2PythonError, 'unsupported local simpleType List: %s' % tp.content.getItemTrace()
  1708.         
  1709.         if content.isUnion():
  1710.             raise Wsdl2PythonError, 'unsupported local simpleType Union: %s' % tp.content.getItemTrace()
  1711.         
  1712.         raise Wsdl2PythonError, 'unexpected schema item: %s' % tp.content.getItemTrace()
  1713.  
  1714.  
  1715.  
  1716. class ElementLocalComplexTypeContainer(TypecodeContainerBase, AttributeMixIn):
  1717.     type = DEC
  1718.     logger = _GetLogger('ElementLocalComplexTypeContainer')
  1719.     
  1720.     def _setContent(self):
  1721.         kw = KW.copy()
  1722.         
  1723.         try:
  1724.             kw.update(dict(klass = self.getClassName(), subclass = 'ZSI.TCcompound.ComplexType', element = 'ElementDeclaration', literal = self.literalTag(), schema = self.schemaTag(), init = self.simpleConstructor(), ns = self.ns, name = self.name, aname = self.getAttributeName(self.name), nsurilogic = self.nsuriLogic(), ofwhat = self.getTypecodeList(), atypecode = self.attribute_typecode, pyclass = self.getPyClass()))
  1725.         except Exception:
  1726.             ex = None
  1727.             args = [
  1728.                 'Failure processing an element w/local complexType: %s' % self._item.getItemTrace()]
  1729.             args += ex.args
  1730.             ex.args = tuple(args)
  1731.             raise 
  1732.  
  1733.         if self.local:
  1734.             kw['element'] = 'LocalElementDeclaration'
  1735.         
  1736.         element = [
  1737.             '%(ID1)sclass %(klass)s(%(subclass)s, %(element)s):',
  1738.             '%(ID2)s%(literal)s',
  1739.             '%(ID2)s%(schema)s',
  1740.             '%(ID2)s%(init)s',
  1741.             '%(ID3)s%(nsurilogic)s',
  1742.             '%(ID3)sTClist = [%(ofwhat)s]',
  1743.             '%(ID3)skw["pname"] = ("%(ns)s","%(name)s")',
  1744.             '%(ID3)skw["aname"] = "%(aname)s"',
  1745.             '%(ID3)s%(atypecode)s = {}',
  1746.             '%(ID3)sZSI.TCcompound.ComplexType.__init__(self,None,TClist,inorder=0,**kw)']
  1747.         for l in self.attrComponents:
  1748.             element.append('%(ID3)s' + str(l))
  1749.         
  1750.         element += self.getPyClassDefinition()
  1751.         element.append('%(ID3)sself.pyclass = %(pyclass)s' % kw)
  1752.         self.writeArray((map,)((lambda l: l % kw), element))
  1753.  
  1754.     
  1755.     def setUp(self, tp):
  1756.         self._item = tp
  1757.         self.name = tp.getAttribute('name')
  1758.         self.ns = tp.getTargetNamespace()
  1759.         self.local = tp.isLocal()
  1760.         complex = tp.content
  1761.         if complex is None:
  1762.             self.mgContent = ()
  1763.             return None
  1764.         
  1765.         if complex.content is None:
  1766.             self.mgContent = ()
  1767.             self.attrComponents = self._setAttributes(complex.getAttributeContent())
  1768.             return None
  1769.         
  1770.         is_simple = complex.content.isSimple()
  1771.         if is_simple and complex.content.content.isExtension():
  1772.             self.mgContent = ()
  1773.             self.attrComponents = self._setAttributes(complex.getAttributeContent())
  1774.             return None
  1775.         
  1776.         if is_simple and complex.content.content.isRestriction():
  1777.             self.mgContent = ()
  1778.             self.attrComponents = self._setAttributes(complex.getAttributeContent())
  1779.             return None
  1780.         
  1781.         if is_simple:
  1782.             raise ContainerError, 'not implemented local complexType/simpleContent: %s' % tp.getItemTrace()
  1783.         
  1784.         is_complex = complex.content.isComplex()
  1785.         if is_complex and complex.content.content is None:
  1786.             self.mgContent = ()
  1787.             self.attrComponents = self._setAttributes(complex.getAttributeContent())
  1788.             return None
  1789.         
  1790.         if is_complex and complex.content.content.isExtension() and complex.content.content.content is not None and complex.content.content.content.isModelGroup():
  1791.             self.mgContent = complex.content.content.content.content
  1792.             self.attrComponents = self._setAttributes(complex.content.content.getAttributeContent())
  1793.             return None
  1794.         
  1795.         if is_complex and complex.content.content.isRestriction() and complex.content.content.content is not None and complex.content.content.content.isModelGroup():
  1796.             self.mgContent = complex.content.content.content.content
  1797.             self.attrComponents = self._setAttributes(complex.content.content.getAttributeContent())
  1798.             return None
  1799.         
  1800.         if is_complex:
  1801.             self.mgContent = ()
  1802.             self.attrComponents = self._setAttributes(complex.getAttributeContent())
  1803.             return None
  1804.         
  1805.         if complex.content.isModelGroup():
  1806.             self.mgContent = complex.content.content
  1807.             self.attrComponents = self._setAttributes(complex.getAttributeContent())
  1808.             return None
  1809.         
  1810.         self.mgContent = ()
  1811.         self.attrComponents = self._setAttributes(complex.getAttributeContent())
  1812.  
  1813.  
  1814.  
  1815. class ElementGlobalDefContainer(TypecodeContainerBase):
  1816.     type = DEC
  1817.     logger = _GetLogger('ElementGlobalDefContainer')
  1818.     
  1819.     def _substitutionGroupTag(self):
  1820.         value = self.substitutionGroup
  1821.         if not value:
  1822.             return 'substitutionGroup = None'
  1823.         
  1824.         (nsuri, ncname) = value
  1825.         return 'substitutionGroup = ("%s","%s")' % (nsuri, ncname)
  1826.  
  1827.     
  1828.     def _setContent(self):
  1829.         kw = KW.copy()
  1830.         
  1831.         try:
  1832.             kw.update(dict(klass = self.getClassName(), element = 'ElementDeclaration', literal = self.literalTag(), substitutionGroup = self._substitutionGroupTag(), schema = self.schemaTag(), init = self.simpleConstructor(), ns = self.ns, name = self.name, aname = self.getAttributeName(self.name), baseslogic = self.getBasesLogic(ID3), alias = NAD.getAlias(self.sKlassNS), subclass = type_class_name(self.sKlass)))
  1833.         except Exception:
  1834.             ex = None
  1835.             args = [
  1836.                 'Failure processing an element w/local complexType: %s' % self._item.getItemTrace()]
  1837.             args += ex.args
  1838.             ex.args = tuple(args)
  1839.             raise 
  1840.  
  1841.         if self.local:
  1842.             kw['element'] = 'LocalElementDeclaration'
  1843.         
  1844.         element = [
  1845.             '%(ID1)sclass %(klass)s(%(element)s):',
  1846.             '%(ID2)s%(literal)s',
  1847.             '%(ID2)s%(schema)s',
  1848.             '%(ID2)s%(substitutionGroup)s',
  1849.             '%(ID2)s%(init)s',
  1850.             '%(ID3)skw["pname"] = ("%(ns)s","%(name)s")',
  1851.             '%(ID3)skw["aname"] = "%(aname)s"',
  1852.             '%(baseslogic)s',
  1853.             '%(ID3)s%(alias)s.%(subclass)s.__init__(self, **kw)',
  1854.             '%(ID3)sif self.pyclass is not None: self.pyclass.__name__ = "%(klass)s_Holder"']
  1855.         self.writeArray((map,)((lambda l: l % kw), element))
  1856.  
  1857.     
  1858.     def setUp(self, element):
  1859.         self._item = element
  1860.         self.local = element.isLocal()
  1861.         self.name = element.getAttribute('name')
  1862.         self.substitutionGroup = element.getAttribute('substitutionGroup')
  1863.         self.ns = element.getTargetNamespace()
  1864.         tp = element.getTypeDefinition('type')
  1865.         self.sKlass = tp.getAttribute('name')
  1866.         self.sKlassNS = tp.getTargetNamespace()
  1867.  
  1868.  
  1869.  
  1870. class ComplexTypeComplexContentContainer(TypecodeContainerBase, AttributeMixIn):
  1871.     type = DEF
  1872.     logger = _GetLogger('ComplexTypeComplexContentContainer')
  1873.     
  1874.     def __init__(self, do_extended = False):
  1875.         TypecodeContainerBase.__init__(self, do_extended = do_extended)
  1876.  
  1877.     
  1878.     def setUp(self, tp):
  1879.         self._item = tp
  1880.         self.extType = None
  1881.         self.restriction = False
  1882.         self.extension = False
  1883.         self._kw_array = None
  1884.         self._is_array = False
  1885.         self.name = tp.getAttribute('name')
  1886.         self.ns = tp.getTargetNamespace()
  1887.         derivation = tp.content.content
  1888.         
  1889.         try:
  1890.             base = derivation.getTypeDefinition('base')
  1891.         except XMLSchema.SchemaError:
  1892.             ex = None
  1893.             base = None
  1894.  
  1895.         if base is None:
  1896.             base = derivation.getAttributeQName('base')
  1897.             if base is None:
  1898.                 raise ContainerError, 'Unsupported derivation: %s' % derivation.getItemTrace()
  1899.             
  1900.             if base != (SOAP.ENC, 'Array') and base != (SCHEMA.XSD3, 'anyType'):
  1901.                 raise ContainerError, 'Unsupported base(%s): %s' % (base, derivation.getItemTrace())
  1902.             
  1903.         
  1904.         if base == (SOAP.ENC, 'Array'):
  1905.             self.logger.debug('Derivation of soapenc:Array')
  1906.             self._is_array = True
  1907.             self._kw_array = {
  1908.                 'atype': None,
  1909.                 'id3': ID3,
  1910.                 'ofwhat': None }
  1911.             self.sKlass = BTI.get_typeclass(base[1], base[0])
  1912.             self.sKlassNS = base[0]
  1913.             for a in derivation.getAttributeContent():
  1914.                 if a.isReference() is False:
  1915.                     continue
  1916.                 
  1917.                 if a.getAttribute('ref') != (SOAP.ENC, 'arrayType'):
  1918.                     continue
  1919.                 
  1920.                 attr = a.getAttributeQName((WSDL.BASE, 'arrayType'))
  1921.                 if attr is None:
  1922.                     warnings.warn('soapenc:array derivation declares attribute reference ("%s","%s"), does not define attribute ("%s","%s")' % (SOAP.ENC, 'arrayType', WSDL.BASE, 'arrayType'))
  1923.                     break
  1924.                 
  1925.                 self._kw_array['atype'] = attr
  1926.                 qname = self._kw_array.get('atype')
  1927.                 if a is not None:
  1928.                     ncname = qname[1].strip('[]')
  1929.                     namespace = qname[0]
  1930.                     
  1931.                     try:
  1932.                         ofwhat = a.getSchemaItem(XMLSchema.TYPES, namespace, ncname)
  1933.                     except XMLSchema.SchemaError:
  1934.                         ex = None
  1935.                         ofwhat = None
  1936.  
  1937.                     if ofwhat is None:
  1938.                         self._kw_array['ofwhat'] = BTI.get_typeclass(ncname, namespace)
  1939.                     else:
  1940.                         self._kw_array['ofwhat'] = GetClassNameFromSchemaItem(ofwhat, do_extended = self.do_extended)
  1941.                     if self._kw_array['ofwhat'] is None:
  1942.                         raise ContainerError, 'For Array could not resolve ofwhat typecode(%s,%s): %s' % (namespace, ncname, derivation.getItemTrace())
  1943.                     
  1944.                     self.logger.debug('Attribute soapenc:arrayType="%s"' % str(self._kw_array['ofwhat']))
  1945.                     break
  1946.                     continue
  1947.             
  1948.         elif isinstance(base, XMLSchema.XMLSchemaComponent):
  1949.             self.sKlass = base.getAttribute('name')
  1950.             self.sKlassNS = base.getTargetNamespace()
  1951.         else:
  1952.             self.sKlass = base.getName()
  1953.             self.sKlassNS = base.getTargetNamespace()
  1954.         attrs = []
  1955.         if derivation.isRestriction():
  1956.             self.restriction = True
  1957.             self.extension = False
  1958.             if not derivation.getAttributeContent():
  1959.                 pass
  1960.             attrs += ()
  1961.         else:
  1962.             self.restriction = False
  1963.             self.extension = True
  1964.             if not tp.getAttributeContent():
  1965.                 pass
  1966.             attrs += ()
  1967.             if isinstance(derivation, XMLSchema.XMLSchemaComponent):
  1968.                 if not derivation.getAttributeContent():
  1969.                     pass
  1970.                 attrs += ()
  1971.             
  1972.         if attrs:
  1973.             self.extType = derivation
  1974.         
  1975.         if derivation.content is not None and derivation.content.isModelGroup():
  1976.             group = derivation.content
  1977.             if group.isReference():
  1978.                 group = group.getModelGroupReference()
  1979.             
  1980.             self.mgContent = group.content
  1981.         elif derivation.content:
  1982.             raise Wsdl2PythonError, 'expecting model group, not: %s' % derivation.content.getItemTrace()
  1983.         else:
  1984.             self.mgContent = ()
  1985.         self.attrComponents = self._setAttributes(tuple(attrs))
  1986.  
  1987.     
  1988.     def _setContent(self):
  1989.         kw = KW.copy()
  1990.         definition = []
  1991.         if self._is_array:
  1992.             if _is_xsd_or_soap_ns(self.sKlassNS) is False and self.sKlass == 'Array':
  1993.                 raise ContainerError, 'unknown type: (%s,%s)' % (self.sKlass, self.sKlassNS)
  1994.             
  1995.             definition += [
  1996.                 '%sclass %s(ZSI.TC.Array, TypeDefinition):' % (ID1, self.getClassName()),
  1997.                 '%s#complexType/complexContent base="SOAP-ENC:Array"' % ID2,
  1998.                 '%s%s' % (ID2, self.schemaTag()),
  1999.                 '%s%s' % (ID2, self.typeTag()),
  2000.                 '%s%s' % (ID2, self.pnameConstructor())]
  2001.             append = definition.append
  2002.             if self._kw_array.get('ofwhat') is None:
  2003.                 append("%s%s.__init__(self, None, None, pname=pname, childnames='item', undeclared=True, **kw)" % (ID3, self.sKlass))
  2004.             else:
  2005.                 append('%(id3)sofwhat = %(ofwhat)s(None, typed=False)' % self._kw_array)
  2006.                 append('%(id3)satype = %(atype)s' % self._kw_array)
  2007.                 append("%s%s.__init__(self, atype, ofwhat, pname=pname, childnames='item', **kw)" % (ID3, self.sKlass))
  2008.             self.writeArray(definition)
  2009.             return None
  2010.         
  2011.         definition += [
  2012.             '%sclass %s(TypeDefinition):' % (ID1, self.getClassName()),
  2013.             '%s%s' % (ID2, self.schemaTag()),
  2014.             '%s%s' % (ID2, self.typeTag()),
  2015.             '%s%s' % (ID2, self.pnameConstructor()),
  2016.             '%s%s' % (ID3, self.nsuriLogic()),
  2017.             '%sTClist = [%s]' % (ID3, self.getTypecodeList())]
  2018.         definition.append('%(ID3)sattributes = %(atc)s = attributes or {}' % {
  2019.             'ID3': ID3,
  2020.             'atc': self.attribute_typecode })
  2021.         isAnyType = (self.sKlassNS, self.sKlass) == (SCHEMA.XSD3, 'anyType')
  2022.         if isAnyType:
  2023.             del definition[0]
  2024.             definition.insert(0, '%sclass %s(ZSI.TC.ComplexType, TypeDefinition):' % (ID1, self.getClassName()))
  2025.             definition.insert(1, '%s#complexType/complexContent restrict anyType' % ID2)
  2026.         
  2027.         definition.append('%sif extend: TClist += ofwhat' % ID3)
  2028.         definition.append('%sif restrict: TClist = ofwhat' % ID3)
  2029.         if len(self.attrComponents) > 0:
  2030.             definition.append('%selse:' % ID3)
  2031.             for l in self.attrComponents:
  2032.                 definition.append('%s%s' % (ID4, l))
  2033.             
  2034.         
  2035.         if isAnyType:
  2036.             definition.append('%sZSI.TC.ComplexType.__init__(self, None, TClist, pname=pname, **kw)' % ID3)
  2037.             definition += self.getPyClassDefinition()
  2038.             kw['pyclass'] = self.getPyClass()
  2039.             definition.append('%(ID3)sself.pyclass = %(pyclass)s' % kw)
  2040.             self.writeArray(definition)
  2041.             return None
  2042.         
  2043.         definition.append('%s' % self.getBasesLogic(ID3))
  2044.         prefix = NAD.getAlias(self.sKlassNS)
  2045.         typeClassName = type_class_name(self.sKlass)
  2046.         if self.restriction:
  2047.             definition.append('%s%s.%s.__init__(self, pname, ofwhat=TClist, restrict=True, **kw)' % (ID3, prefix, typeClassName))
  2048.             definition.insert(1, '%s#complexType/complexContent restriction' % ID2)
  2049.             self.writeArray(definition)
  2050.             return None
  2051.         
  2052.         if self.extension:
  2053.             definition.append('%s%s.%s.__init__(self, pname, ofwhat=TClist, extend=True, attributes=attributes, **kw)' % (ID3, prefix, typeClassName))
  2054.             definition.insert(1, '%s#complexType/complexContent extension' % ID2)
  2055.             self.writeArray(definition)
  2056.             return None
  2057.         
  2058.         raise Wsdl2PythonError, 'ComplexContent must be a restriction or extension'
  2059.  
  2060.     
  2061.     def pnameConstructor(self, superclass = None):
  2062.         if superclass:
  2063.             return '%s.__init__(self, pname, ofwhat=(), extend=False, restrict=False, attributes=None, **kw)' % superclass
  2064.         
  2065.         return 'def __init__(self, pname, ofwhat=(), extend=False, restrict=False, attributes=None, **kw):'
  2066.  
  2067.  
  2068.  
  2069. class ComplexTypeContainer(TypecodeContainerBase, AttributeMixIn):
  2070.     type = DEF
  2071.     logger = _GetLogger('ComplexTypeContainer')
  2072.     
  2073.     def setUp(self, tp, empty = False):
  2074.         self._item = tp
  2075.         self.name = tp.getAttribute('name')
  2076.         self.ns = tp.getTargetNamespace()
  2077.         self.mixed = tp.isMixed()
  2078.         self.mgContent = ()
  2079.         self.attrComponents = self._setAttributes(tp.getAttributeContent())
  2080.         self._item = tp
  2081.         if empty:
  2082.             return None
  2083.         
  2084.         model = tp.content
  2085.         if model.isReference():
  2086.             model = model.getModelGroupReference()
  2087.         
  2088.         if model is None:
  2089.             return None
  2090.         
  2091.         if model.content is None:
  2092.             return None
  2093.         
  2094.         self.mgContent = model
  2095.  
  2096.     
  2097.     def _setContent(self):
  2098.         
  2099.         try:
  2100.             definition = [
  2101.                 '%sclass %s(ZSI.TCcompound.ComplexType, TypeDefinition):' % (ID1, self.getClassName()),
  2102.                 '%s%s' % (ID2, self.schemaTag()),
  2103.                 '%s%s' % (ID2, self.typeTag()),
  2104.                 '%s%s' % (ID2, self.pnameConstructor()),
  2105.                 '%s%s' % (ID3, self.nsuriLogic()),
  2106.                 '%sTClist = [%s]' % (ID3, self.getTypecodeList())]
  2107.         except Exception:
  2108.             ex = None
  2109.             args = [
  2110.                 'Failure processing %s' % self._item.getItemTrace()]
  2111.             args += ex.args
  2112.             ex.args = tuple(args)
  2113.             raise 
  2114.  
  2115.         definition.append('%s%s = attributes or {}' % (ID3, self.attribute_typecode))
  2116.         definition.append('%sif extend: TClist += ofwhat' % ID3)
  2117.         definition.append('%sif restrict: TClist = ofwhat' % ID3)
  2118.         if len(self.attrComponents) > 0:
  2119.             definition.append('%selse:' % ID3)
  2120.             for l in self.attrComponents:
  2121.                 definition.append('%s%s' % (ID4, l))
  2122.             
  2123.         
  2124.         definition.append('%sZSI.TCcompound.ComplexType.__init__(self, None, TClist, pname=pname, inorder=0, %s**kw)' % (ID3, self.getExtraFlags()))
  2125.         definition += self.getPyClassDefinition()
  2126.         kw = KW.copy()
  2127.         kw['pyclass'] = self.getPyClass()
  2128.         definition.append('%(ID3)sself.pyclass = %(pyclass)s' % kw)
  2129.         self.writeArray(definition)
  2130.  
  2131.     
  2132.     def pnameConstructor(self, superclass = None):
  2133.         if superclass:
  2134.             return '%s.__init__(self, pname, ofwhat=(), attributes=None, extend=False, restrict=False, **kw)' % superclass
  2135.         
  2136.         return 'def __init__(self, pname, ofwhat=(), attributes=None, extend=False, restrict=False, **kw):'
  2137.  
  2138.  
  2139.  
  2140. class SimpleTypeContainer(TypecodeContainerBase):
  2141.     type = DEF
  2142.     logger = _GetLogger('SimpleTypeContainer')
  2143.     
  2144.     def __init__(self):
  2145.         TypecodeContainerBase.__init__(self)
  2146.  
  2147.     
  2148.     def setUp(self, tp):
  2149.         raise NotImplementedError, 'abstract method not implemented'
  2150.  
  2151.     
  2152.     def _setContent(self, tp):
  2153.         raise NotImplementedError, 'abstract method not implemented'
  2154.  
  2155.     
  2156.     def getPythonType(self):
  2157.         pyclass = eval(str(self.sKlass))
  2158.         if issubclass(pyclass, ZSI.TC.String):
  2159.             return 'str'
  2160.         
  2161.         if issubclass(pyclass, ZSI.TC.Ilong) or issubclass(pyclass, ZSI.TC.IunsignedLong):
  2162.             return 'long'
  2163.         
  2164.         if issubclass(pyclass, ZSI.TC.Boolean) or issubclass(pyclass, ZSI.TC.Integer):
  2165.             return 'int'
  2166.         
  2167.         if issubclass(pyclass, ZSI.TC.Decimal):
  2168.             return 'float'
  2169.         
  2170.         if issubclass(pyclass, ZSI.TC.Gregorian) or issubclass(pyclass, ZSI.TC.Duration):
  2171.             return 'tuple'
  2172.         
  2173.  
  2174.     
  2175.     def getPyClassDefinition(self):
  2176.         definition = []
  2177.         pt = self.getPythonType()
  2178.         if pt is not None:
  2179.             definition.append('%sclass %s(%s):' % (ID3, self.getPyClass(), pt))
  2180.             definition.append('%stypecode = self' % ID4)
  2181.         
  2182.         return definition
  2183.  
  2184.  
  2185.  
  2186. class RestrictionContainer(SimpleTypeContainer):
  2187.     logger = _GetLogger('RestrictionContainer')
  2188.     
  2189.     def setUp(self, tp):
  2190.         self._item = tp
  2191.         if tp.content is None:
  2192.             raise Wsdl2PythonError, 'empty simpleType defintion: %s' % tp.getItemTrace()
  2193.         
  2194.         self.name = tp.getAttribute('name')
  2195.         self.ns = tp.getTargetNamespace()
  2196.         self.sKlass = None
  2197.         base = tp.content.getAttribute('base')
  2198.         if base is not None:
  2199.             
  2200.             try:
  2201.                 item = tp.content.getTypeDefinition('base')
  2202.             except XMLSchema.SchemaError:
  2203.                 ex = None
  2204.                 item = None
  2205.  
  2206.             if item is None:
  2207.                 self.sKlass = BTI.get_typeclass(base.getName(), base.getTargetNamespace())
  2208.                 if self.sKlass is not None:
  2209.                     return None
  2210.                 
  2211.                 raise Wsdl2PythonError('no built-in type nor schema instance type for base attribute("%s","%s"): %s' % (base.getTargetNamespace(), base.getName(), tp.getItemTrace()))
  2212.             
  2213.             raise Wsdl2PythonError, 'Not Supporting simpleType/Restriction w/User-Defined Base: %s %s' % (tp.getItemTrace(), item.getItemTrace())
  2214.         
  2215.         sc = tp.content.getSimpleTypeContent()
  2216.         if sc is not None:
  2217.             if sc.isSimple() is sc.isSimple() and sc.isLocal() is sc.isLocal():
  2218.                 pass
  2219.             elif sc.isLocal() is sc.isDefinition():
  2220.                 base = None
  2221.                 if sc.content.isRestriction() is True:
  2222.                     
  2223.                     try:
  2224.                         item = tp.content.getTypeDefinition('base')
  2225.                     except XMLSchema.SchemaError:
  2226.                         ex = None
  2227.  
  2228.                     if item is None:
  2229.                         base = sc.content.getAttribute('base')
  2230.                         if base is not None:
  2231.                             self.sKlass = BTI.get_typeclass(base.getTargetNamespace(), base.getName())
  2232.                             return None
  2233.                         
  2234.                         raise Wsdl2PythonError, 'Not Supporting simpleType/Restriction w/User-Defined Base: ' % item.getItemTrace()
  2235.                     
  2236.                     raise Wsdl2PythonError, 'Not Supporting simpleType/Restriction w/User-Defined Base: ' % item.getItemTrace()
  2237.                 
  2238.                 if sc.content.isList() is True:
  2239.                     raise Wsdl2PythonError, 'iction base in subtypes: %s' % sc.getItemTrace()
  2240.                 
  2241.                 if sc.content.isUnion() is True:
  2242.                     raise Wsdl2PythonError, 'could not get restriction base in subtypes: %s' % sc.getItemTrace()
  2243.                 
  2244.                 return None
  2245.             
  2246.         raise Wsdl2PythonError, 'No Restriction @base/simpleType: %s' % tp.getItemTrace()
  2247.  
  2248.     
  2249.     def _setContent(self):
  2250.         definition = [
  2251.             '%sclass %s(%s, TypeDefinition):' % (ID1, self.getClassName(), self.sKlass),
  2252.             '%s%s' % (ID2, self.schemaTag()),
  2253.             '%s%s' % (ID2, self.typeTag()),
  2254.             '%s%s' % (ID2, self.pnameConstructor())]
  2255.         if self.getPythonType() is None:
  2256.             definition.append('%s%s.__init__(self, pname, **kw)' % (ID3, self.sKlass))
  2257.         else:
  2258.             definition.append('%s%s.__init__(self, pname, pyclass=None, **kw)' % (ID3, self.sKlass))
  2259.             definition += self.getPyClassDefinition()
  2260.             kw = KW.copy()
  2261.             kw['pyclass'] = self.getPyClass()
  2262.             definition.append('%(ID3)sself.pyclass = %(pyclass)s' % kw)
  2263.         self.writeArray(definition)
  2264.  
  2265.  
  2266.  
  2267. class ComplexTypeSimpleContentContainer(SimpleTypeContainer, AttributeMixIn):
  2268.     type = DEF
  2269.     logger = _GetLogger('ComplexTypeSimpleContentContainer')
  2270.     
  2271.     def setUp(self, tp):
  2272.         self._item = tp
  2273.         simple = tp.content
  2274.         dv = simple.content
  2275.         self.name = tp.getAttribute('name')
  2276.         self.ns = tp.getTargetNamespace()
  2277.         self.content.attributeContent = dv.getAttributeContent()
  2278.         base = dv.getAttribute('base')
  2279.         if base is not None:
  2280.             self.sKlass = BTI.get_typeclass(base[1], base[0])
  2281.             if not self.sKlass:
  2282.                 self.sKlass = base[1]
  2283.                 self.sKlassNS = base[0]
  2284.             
  2285.             self.attrComponents = self._setAttributes(self.content.attributeContent)
  2286.             return None
  2287.         
  2288.         raise Wsdl2PythonError, 'simple content derivation bad base attribute: ' % tp.getItemTrace()
  2289.  
  2290.     
  2291.     def _setContent(self):
  2292.         if type(self.sKlass) in (types.ClassType, type):
  2293.             definition = [
  2294.                 '%sclass %s(%s, TypeDefinition):' % (ID1, self.getClassName(), self.sKlass),
  2295.                 '%s# ComplexType/SimpleContent derivation of built-in type' % ID2,
  2296.                 '%s%s' % (ID2, self.schemaTag()),
  2297.                 '%s%s' % (ID2, self.typeTag()),
  2298.                 '%s%s' % (ID2, self.pnameConstructor()),
  2299.                 '%sif getattr(self, "attribute_typecode_dict", None) is None: %s = {}' % (ID3, self.attribute_typecode)]
  2300.             for l in self.attrComponents:
  2301.                 definition.append('%s%s' % (ID3, l))
  2302.             
  2303.             definition.append('%s%s.__init__(self, pname, **kw)' % (ID3, self.sKlass))
  2304.             if self.getPythonType() is not None:
  2305.                 definition += self.getPyClassDefinition()
  2306.                 kw = KW.copy()
  2307.                 kw['pyclass'] = self.getPyClass()
  2308.                 definition.append('%(ID3)sself.pyclass = %(pyclass)s' % kw)
  2309.             
  2310.             self.writeArray(definition)
  2311.             return None
  2312.         
  2313.         definition = [
  2314.             '%sclass %s(TypeDefinition):' % (ID1, self.getClassName()),
  2315.             '%s# ComplexType/SimpleContent derivation of user-defined type' % ID2,
  2316.             '%s%s' % (ID2, self.schemaTag()),
  2317.             '%s%s' % (ID2, self.typeTag()),
  2318.             '%s%s' % (ID2, self.pnameConstructor()),
  2319.             '%s%s' % (ID3, self.nsuriLogic()),
  2320.             '%s' % self.getBasesLogic(ID3),
  2321.             '%sif getattr(self, "attribute_typecode_dict", None) is None: %s = {}' % (ID3, self.attribute_typecode)]
  2322.         for l in self.attrComponents:
  2323.             definition.append('%s%s' % (ID3, l))
  2324.         
  2325.         definition.append('%s%s.%s.__init__(self, pname, **kw)' % (ID3, NAD.getAlias(self.sKlassNS), type_class_name(self.sKlass)))
  2326.         self.writeArray(definition)
  2327.  
  2328.     
  2329.     def getPyClassDefinition(self):
  2330.         definition = []
  2331.         pt = self.getPythonType()
  2332.         if pt is not None:
  2333.             definition.append('%sclass %s(%s):' % (ID3, self.getPyClass(), pt))
  2334.             if self.metaclass is not None:
  2335.                 definition.append('%s__metaclass__ = %s' % (ID4, self.metaclass))
  2336.             
  2337.             definition.append('%stypecode = self' % ID4)
  2338.         
  2339.         return definition
  2340.  
  2341.  
  2342.  
  2343. class UnionContainer(SimpleTypeContainer):
  2344.     type = DEF
  2345.     logger = _GetLogger('UnionContainer')
  2346.     
  2347.     def __init__(self):
  2348.         SimpleTypeContainer.__init__(self)
  2349.         self.memberTypes = None
  2350.  
  2351.     
  2352.     def setUp(self, tp):
  2353.         self._item = tp
  2354.         if tp.content.isUnion() is False:
  2355.             raise ContainerError, 'content must be a Union: %s' % tp.getItemTrace()
  2356.         
  2357.         self.name = tp.getAttribute('name')
  2358.         self.ns = tp.getTargetNamespace()
  2359.         self.sKlass = 'ZSI.TC.Union'
  2360.         self.memberTypes = tp.content.getAttribute('memberTypes')
  2361.  
  2362.     
  2363.     def _setContent(self):
  2364.         definition = [
  2365.             '%sclass %s(%s, TypeDefinition):' % (ID1, self.getClassName(), self.sKlass),
  2366.             '%smemberTypes = %s' % (ID2, self.memberTypes),
  2367.             '%s%s' % (ID2, self.schemaTag()),
  2368.             '%s%s' % (ID2, self.typeTag()),
  2369.             '%s%s' % (ID2, self.pnameConstructor()),
  2370.             '%s%s' % (ID3, self.pnameConstructor(self.sKlass))]
  2371.         self.writeArray(definition)
  2372.  
  2373.  
  2374.  
  2375. class ListContainer(SimpleTypeContainer):
  2376.     type = DEF
  2377.     logger = _GetLogger('ListContainer')
  2378.     
  2379.     def setUp(self, tp):
  2380.         self._item = tp
  2381.         if tp.content.isList() is False:
  2382.             raise ContainerError, 'content must be a List: %s' % tp.getItemTrace()
  2383.         
  2384.         self.name = tp.getAttribute('name')
  2385.         self.ns = tp.getTargetNamespace()
  2386.         self.sKlass = 'ZSI.TC.List'
  2387.         self.itemType = tp.content.getAttribute('itemType')
  2388.  
  2389.     
  2390.     def _setContent(self):
  2391.         definition = [
  2392.             '%sclass %s(%s, TypeDefinition):' % (ID1, self.getClassName(), self.sKlass),
  2393.             '%sitemType = %s' % (ID2, self.itemType),
  2394.             '%s%s' % (ID2, self.schemaTag()),
  2395.             '%s%s' % (ID2, self.typeTag()),
  2396.             '%s%s' % (ID2, self.pnameConstructor()),
  2397.             '%s%s' % (ID3, self.pnameConstructor(self.sKlass))]
  2398.         self.writeArray(definition)
  2399.  
  2400.  
  2401.